对于 WPF/Silverlight 布局,使用具有大量行和列的 Grid 还是使用大量 Stackpanel 更好?
7 回答
如果您需要将事物水平和垂直排列,则应该使用网格。当这些东西不需要与其他任何东西对齐时,使用 StackPanel 创建一行或一列。
但是,不要将自己限制在这两个选项中。特别是,看看 DockPanel。它比 StackPanel 稍微复杂一些,但它的标记并不像 Grid 那样混乱。这是 DockPanel 上的一篇好文章:
您使用的容器应该基于内容,而不是一种方法是否优于另一种方法。如果你需要水平和垂直排列的东西,你真的应该使用网格。但除此之外,这实际上取决于您打算显示的内容。
我认为网格是一个更好的主意。我通常使用 Grid 设置总体布局,并在这里和那里使用一些堆栈面板来做一些特定的事情。我也有一种感觉,网格的性能更好,而且网格通常会给你更多的灵活性。
我不认为 Grid 是一个更好的主意。
例如,如果您想在现有的 Grid 布局文档中插入一行(在中间)
现有行是 1,2,3,4 ,那么要求是在 1 和 2 之间插入新行。
然后您必须将 2,3,4 更改为 3,4,5 (查找所有标记更改....)
想想如果一行有 3 - 5 列......重新排序所有数字是一项肮脏的工作。!!!
我更喜欢 StackPanel,因为我发现在插入新元素、行或列时更容易进行更改。使用网格,您需要阅读行号和列号以找出您的位置。使用 StackPanel,您只需跟随嵌套,这比网格更容易且不那么混乱。
例如,在 XAML 页面中,我使用像父网格一样的水平堆栈面板,然后如果我需要一个列,我会嵌套一个单独的“垂直”堆栈面板。这样,水平堆栈面板变成了“网格”,嵌套的垂直堆栈面板变成了列。我发现这更容易阅读和修改网格中的行和列。
两者都有力量(网格/堆栈面板)。Grid 的问题是线条重组。Stackpanel 的问题是没有表结构(固定列宽)。所以我认为这是解决这个问题的好方法:-)
定义样式
<Page.Resources>
<Style x:Key="LabelCol1" TargetType="Label">
<Setter Property="Width" Value="200" />
</Style>
<Style x:Key="EditCol2" TargetType="TextBox">
<Setter Property="Width" Value="250" />
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="Margin" Value="3" />
</Style>
<Style x:Key="ButtonCol3" TargetType="Button">
<Setter Property="Width" Value="120" />
<Setter Property="Margin" Value="3" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
</Page.Resources>
并在 Stackpanel 中使用样式
<StackPanel>
<StackPanel Orientation="Horizontal">
<Label Style="{StaticResource LabelCol1}" Content="Solution path" />
<TextBox Style="{StaticResource EditCol2}" />
<Button Style="{StaticResource ButtonCol3}" Content="Open..." />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Style="{StaticResource LabelCol1}" Content="Solution name" />
<TextBox Style="{StaticResource EditCol2}" />
</StackPanel>
</StackPanel>
我对这种布局没有经验,但我敢打赌,与许多嵌套的堆栈面板相比,网格更容易渲染。