让我们阅读这些代码,我在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的节点数量较少,但内存成本会更高。为什么呢?
答案 0 :(得分:31)
您可能对此问题的答案感兴趣:In what order are Panels the most efficient in terms of render time and performance?
简短的回答是,它取决于面板有多少个孩子,以及这些元素的大小和位置。但在大多数情况下,StackPanel
比Grid
效率更高,因为它有更快的测量和排列传递。
<强>网格强>
定义由列和行组成的灵活网格区域。
如果成比例,这可能是性能最高的面板 使用尺寸或自动尺寸调整。计算子项目大小可以是a 项目的原生大小和布局的复杂组合 由网格指定。布局也是最复杂的 面板。测量通过的速度慢到中等,慢到 安排通过的中等表现。
<强>的StackPanel 强>
将子元素排列成一条可以水平或垂直定向的行。
StackPanel使用本机或亲属测量其子节点 从其方向和原生的相反方向确定尺寸 在其方向上确定尺寸(对齐无效 这个方向)。这使它成为这一领域的中级表演者。该 安排通行证很简单,只需按顺序布置物品。 可能是这次传球的第二好成绩。中等表现 用于测量传递和布局传递的快速性能。
此外,在内存消耗方面,两个对象都不同,占用的内存量不同,而Grid
有RowDefinitions
和ColumnDefinitions
,所以它实际上包含的对象多于你的StackPanel