20

これらのコードを読んでみましょう。WindowsPhone8プロジェクトで2つの類似したUserControlを定義しましたが、どちらが優れているかを本当に知りたいと思います。プロファイリングを確認しましたが、ほぼ同じようです。

UserControl 1、グリッドのプロパティを使用してレイアウトを設計します。

<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スパイを使用して視覚化ツリーを分析すると、UserControl 1のノード数は少なくなりますが、メモリのコストが少し高くなります。なんで?

4

1 に答える 1

34

この質問への回答に興味があるかもしれません:レンダリング時間とパフォーマンスの観点から、パネルはどの順序で最も効率的ですか?

簡単に言うと、パネルの子の数と、それらの要素のサイズと配置によって異なります。ただし、ほとんどの場合、aは、より高速なメジャーとアレンジメントパスの両方を備えているため、aよりStackPanelも効率的です。Grid

受け入れられた答えから引用するには:

グリッド

列と行で構成される柔軟なグリッド領域を定義します。

比例サイジングまたは自動サイジングが使用されている場合、これは最もパフォーマンスを重視するパネルになる可能性があります。子アイテムのサイズの計算は、アイテムのネイティブサイズとグリッドで指定されたレイアウトの複雑な組み合わせになる場合があります。レイアウトもすべてのパネルの中で最も複雑です。メジャーパスの場合は低速から中程度のパフォーマンス、アレンジメントパスの場合は低速から中程度のパフォーマンス。

StackPanel

子要素を、水平方向または垂直方向に配置できる1本の線に配置します。

StackPanelは、方向とは反対の方向のネイティブまたは相対サイズと、その方向の方向のネイティブサイズを使用して、子を測定します(位置合わせはこの方向には何もしません)。これにより、この分野の中間レベルのパフォーマーになります。アレンジメントパスは、アイテムを順番に並べるだけです。おそらく、このパスで2番目に優れたパフォーマンスです。メジャーパスでは中程度のパフォーマンス、レイアウトパスでは高速パフォーマンス。

また、メモリ消費に関しては、両方のオブジェクトが異なり、異なる量のメモリを消費します。また、GridhasRowDefinitionsColumnDefinitions、であるため、実際には、より多くのオブジェクトが含まれています。StackPanel

于 2013-03-22T17:02:58.953 に答える