Grid和StackPanel有哪些更好的性能?

让我们来阅读这些代码,我已经在Windows Phone 8项目中定义了两个类似的UserControls,我真的想要哪个更好。 我检查了剖析,看起来他们几乎是一样的。

UserControl 1,使用网格的属性来devise我的布局。

<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}" Height="108"> <Grid.RowDefinitions> <RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"></ColumnDefinition> <ColumnDefinition Width="*"></ColumnDefinition> </Grid.ColumnDefinitions> <Rectangle Grid.RowSpan="2" Grid.Row="0" Height="108" Width="54" Fill="Blue"></Rectangle> <TextBlock Grid.Row="0" Grid.Column="1" Text="Caption" Style="{StaticResource PhoneTextExtraLargeStyle}"></TextBlock> <TextBlock Grid.Row="1" Grid.Column="1" Text="URLURLURLURLURLURL" Style="{StaticResource PhoneTextSmallStyle}"></TextBlock> </Grid> 

UserControl 2,使用StackPanel来devise我的布局。

 <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}" Height="108"> <StackPanel Orientation="Horizontal"> <Rectangle Height="108" Width="54" Fill="Red"></Rectangle> <StackPanel Orientation="Vertical"> <TextBlock Text="Caption" Style="{StaticResource PhoneTextExtraLargeStyle}"></TextBlock> <TextBlock Text="URLURLURLURLURLURL" Style="{StaticResource PhoneTextSmallStyle}"></TextBlock> </StackPanel> </StackPanel> </Grid> 

它看起来像基本的布局是一样的。 但是,当我使用XAML Spy来分析可视化树时,UserControl 1的节点较less,但是会花费更多的内存。 为什么?

您可能对这个问题的答案感兴趣: 在渲染时间和性能方面,面板的排列顺序是什么?

简短的答案取决于面板有多少个孩子,以及这些元素的大小和位置。 但是在大多数情况下, StackPanel将比Grid更高效,因为它具有更快的度量和安排。

引用接受的答案 :

定义一个由列和行组成的灵活的网格区域。

如果使用比例尺寸调整或自动调整大小,这可能是性能最密集的面板。 计算子项目大小可以是项目本地大小与网格指定的布局的复杂组合。 布局也是所有面板中最复杂的。 对于测量通过速度慢到中等性能,安排通过速度慢到中等性能。

StackPanel中

将子元素排列成可以水平或垂直定位的单行。

StackPanel使用原生或相对的尺寸来定位它的子体,方向与其方向相反,并且在其方向上进行原生尺寸调整(在这个方向上排列没有任何变化)。 这使得它成为这个领域的中等水平。 安排通行证是简单的,只是按顺序布置项目。 可能是这个传球的第二好的表现。 测量通过的中等性能和通过布局的快速性能。

同样在内存消耗方面,两个对象都是不同的,并占用不同的内存,一个GridRowDefinitionsColumnDefinitions ,所以它实际上包含比你的StackPanel更多的对象