参考链接
简述
- 作用:将子元素排列成水平或垂直的一行。
- 横向排列时,无法设置水平对齐属性,默认左对齐。纵向排列时,无法设置垂直对齐属性,默认顶部对齐
- 和DockPanel中Dock.Left的区别:DockPanel最后一个子元素会占满剩余的空间,StackPanel不会
- StackPanel实现IScrollInfo接口以支持逻辑滚动。 逻辑滚动用于滚动到逻辑树中的下一个元素。 这与物理滚动相反,它按给定方向定义的物理增量滚动内容。 如果需要物理滚动而不是逻辑滚动,请将主机 StackPanel 元素包装在一个 ScrollViewer 中,并将其 CanContentScroll 属性设置为 false。
- 子类:ToolBarPanel
在处理大型 Children 集合时,请考虑使用 VirtualizingStackPanel 而不是常规的 StackPanel。通过虚拟化子集合,VirtualizingStackPanel 仅在内存中保留当前位于父级视区内的对象。 因此,在大多数情况下,性能得到显著提高。
其他
StackPanel和DockPanel的区别
尽管 DockPanel 也可以“堆叠”子元素,但 DockPanel 和 StackPanel 在某些使用情况下不会产生相似结果。 例如,子元素的顺序可能影响它们在 DockPanel 中的大小,但不会影响这些元素在 StackPanel 中的大小。 这是因为 StackPanel 在 PositiveInfinity 的堆叠方向上测量,而 DockPanel 仅测量可用大小。
以下示例演示此主要区别。<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"WindowTitle="StackPanel vs. DockPanel"><Grid Width="175" Height="150"><Grid.ColumnDefinitions><ColumnDefinition /></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition /><RowDefinition /></Grid.RowDefinitions><DockPanel Grid.Column="0" Grid.Row="0"><Image Source="smiley_stackpanel.png" /><Image Source="smiley_stackpanel.png" /><Image Source="smiley_stackpanel.png" Stretch="Fill"/></DockPanel><StackPanel Grid.Column="0" Grid.Row="1" Orientation="Horizontal"><Image Source="smiley_stackpanel.png" /><Image Source="smiley_stackpanel.png" /><Image Source="smiley_stackpanel.png" Stretch="Fill"/></StackPanel></Grid></Page>
实践
官方示例
以下示例演示如何使用 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。
