Grid和StackPanel,它有更好的性能?

Edd*_*die 16 windows wpf windows-phone-8

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

UserControl 1,使用grid的属性来设计我的布局.

<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>
Run Code Online (Sandbox Code Playgroud)

UserControl 2,使用StackPanel设计我的布局.

<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>
Run Code Online (Sandbox Code Playgroud)

看起来基本布局是一样的.但是当我使用XAML Spy来分析可视化树时,UserControl 1的节点数量较少,但内存需要更多.为什么?

Rac*_*hel 32

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

简短的回答是它取决于面板有多少个孩子,以及这些元素的大小和位置.但在大多数情况下,a StackPanel将比a更有效,Grid因为它具有更快的测量和布置通过.

引用接受的答案:

定义由列和行组成的灵活网格区域.

如果使用比例尺寸或自动尺寸调整,这可能是性能最高的面板.计算子项目大小可以是项目的本机大小和网格指定的布局的复杂组合.布局也是所有面板中最复杂的.测量通过的慢到中等性能和布置通过的慢到中等性能.

StackPanel中

将子元素排列成可以水平或垂直定向的单个行.

StackPanel使用与其方向相反方向的原生或相对大小以及在其方向上的原生大小来测量其子级(对齐在此方向上没有任何作用).这使它成为这一领域的中级表演者.安排通行证很简单,只是按顺序布置项目.可能是这次传球的第二好成绩.测量通过的中等性能和布局通过的快速性能.

另外,在关于内存消耗,这两个对象是不同的,并采取了不同数量的内存,并且GridRowDefinitionsColumnDefinitions,因此它实际上包含了超过你的对象StackPanel