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

时间:2013-03-22 16:53:48

标签: wpf windows 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>

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>

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

1 个答案:

答案 0 :(得分:31)

您可能对此问题的答案感兴趣:In what order are Panels the most efficient in terms of render time and performance?

简短的回答是,它取决于面板有多少个孩子,以及这些元素的大小和位置。但在大多数情况下,StackPanelGrid效率更高,因为它有更快的测量和排列传递。

引用accepted answer

  

<强>网格

     
    

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

  
     

如果成比例,这可能是性能最高的面板   使用尺寸或自动尺寸调整。计算子项目大小可以是a   项目的原生大小和布局的复杂组合   由网格指定。布局也是最复杂的   面板。测量通过的速度慢到中等,慢到   安排通过的中等表现。

     

<强>的StackPanel

     
    

将子元素排列成一条可以水平或垂直定向的行。

  
     

StackPanel使用本机或亲属测量其子节点   从其方向和原生的相反方向确定尺寸   在其方向上确定尺寸(对齐无效   这个方向)。这使它成为这一领域的中级表演者。该   安排通行证很简单,只需按顺序布置物品。   可能是这次传球的第二好成绩。中等表现   用于测量传递和布局传递的快速性能。

此外,在内存消耗方面,两个对象都不同,占用的内存量不同,而GridRowDefinitionsColumnDefinitions,所以它实际上包含的对象多于你的StackPanel