参考链接

《WPF编程宝典》3.2
《深入浅出WPF》5.4.3

简述

  1. 作用:将子元素排列成水平或垂直的一行。
  2. 横向排列时,无法设置水平对齐属性,默认左对齐。纵向排列时,无法设置垂直对齐属性,默认顶部对齐
  3. 和DockPanel中Dock.Left的区别:DockPanel最后一个子元素会占满剩余的空间,StackPanel不会
  4. StackPanel实现IScrollInfo接口以支持逻辑滚动。 逻辑滚动用于滚动到逻辑树中的下一个元素。 这与物理滚动相反,它按给定方向定义的物理增量滚动内容。 如果需要物理滚动而不是逻辑滚动,请将主机 StackPanel 元素包装在一个 ScrollViewer 中,并将其 CanContentScroll 属性设置为 false。
  5. 子类:ToolBarPanel
  6. 在处理大型 Children 集合时,请考虑使用 VirtualizingStackPanel 而不是常规的 StackPanel。通过虚拟化子集合,VirtualizingStackPanel 仅在内存中保留当前位于父级视区内的对象。 因此,在大多数情况下,性能得到显著提高。

    其他

    StackPanel和DockPanel的区别

    尽管 DockPanel 也可以“堆叠”子元素,但 DockPanelStackPanel 在某些使用情况下不会产生相似结果。 例如,子元素的顺序可能影响它们在 DockPanel 中的大小,但不会影响这些元素在 StackPanel 中的大小。 这是因为 StackPanelPositiveInfinity 的堆叠方向上测量,而 DockPanel 仅测量可用大小。
    以下示例演示此主要区别。

    1. <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    2. WindowTitle="StackPanel vs. DockPanel">
    3. <Grid Width="175" Height="150">
    4. <Grid.ColumnDefinitions>
    5. <ColumnDefinition />
    6. </Grid.ColumnDefinitions>
    7. <Grid.RowDefinitions>
    8. <RowDefinition />
    9. <RowDefinition />
    10. </Grid.RowDefinitions>
    11. <DockPanel Grid.Column="0" Grid.Row="0">
    12. <Image Source="smiley_stackpanel.png" />
    13. <Image Source="smiley_stackpanel.png" />
    14. <Image Source="smiley_stackpanel.png" Stretch="Fill"/>
    15. </DockPanel>
    16. <StackPanel Grid.Column="0" Grid.Row="1" Orientation="Horizontal">
    17. <Image Source="smiley_stackpanel.png" />
    18. <Image Source="smiley_stackpanel.png" />
    19. <Image Source="smiley_stackpanel.png" Stretch="Fill"/>
    20. </StackPanel>
    21. </Grid>
    22. </Page>

    通过此图像可以看到呈现行为的区别。
    StackPanel - 图1

    实践

    官方示例

    以下示例演示如何使用 StackPanel 创建一组垂直定位的按钮。 对于水平定位,请将 Orientation 属性设置为 Horizontal。 ```csharp // Create the application’s main window mainWindow = new Window (); mainWindow.Title = “StackPanel Sample”;

// Define the StackPanel myStackPanel = new StackPanel(); myStackPanel.HorizontalAlignment = HorizontalAlignment.Left; myStackPanel.VerticalAlignment = VerticalAlignment.Top;

// Define child content Button myButton1 = new Button(); myButton1.Content = “Button 1”; Button myButton2 = new Button(); myButton2.Content = “Button 2”; Button myButton3 = new Button(); myButton3.Content = “Button 3”;

// Add child elements to the parent StackPanel myStackPanel.Children.Add(myButton1); myStackPanel.Children.Add(myButton2); myStackPanel.Children.Add(myButton3);

// Add the StackPanel as the Content of the Parent Window Object mainWindow.Content = myStackPanel; mainWindow.Show (); ``` 已编译的应用程序将生成如下所示的新 UI。
StackPanel - 图2