2013-03-22 12 views
9

Przeczytajmy te kody, zdefiniowałem dwa podobne UserControls w projekcie Windows Phone 8 i naprawdę chcę, który z nich jest lepszy. Sprawdziłem profilowanie, wygląda na to, że są prawie takie same.Siatka i StackPanel, który ma lepszą wydajność?

UserControl 1, używając właściwości siatki do zaprojektowania mojego układu.

<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, używając StackPanel do zaprojektowania mojego układu.

<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> 

Wygląda na to, że podstawowy układ jest taki sam. Ale kiedy używam XAML Spy do analizy drzewa wizualizacji, UserControl 1 ma mniej węzłów, ale kosztuje trochę więcej pamięci. Czemu?

Odpowiedz

22

Możesz być zainteresowany w odpowiedzi na to pytanie: In what order are Panels the most efficient in terms of render time and performance?

Krótka odpowiedź brzmi: to zależy od tego, ile dzieci panele mają, i jak te elementy są umieszczone i wielkości. Ale w większości przypadków, StackPanel będzie bardziej wydajny niż Grid, ponieważ ma zarówno szybszy pomiar, jak i przejście dla układu.

Cytując z accepted answer:

Siatka

Definiuje elastyczną powierzchnię rusztu, który składa się z kolumn i wierszy.

Może to być panel o największej wydajności, jeśli zostanie zastosowana proporcjonalna zmiana rozmiaru lub automatyczne wymiarowanie w rozmiarze . Obliczanie rozmiaru elementu potomnego może być złożoną kombinacją rodzimego rozmiaru elementu i układu określonego przez siatkę. Układ jest także najbardziej skomplikowanym ze wszystkich paneli . Wydajność wolna do średniej dla przejścia środka i powolna do średnia wydajność dla przejścia dla układu.

StackPanel

Układa elementy dziecko w jednej linii, które mogą być ustawiane pionowo lub poziomo.

StackPanel mierzy swoje dzieci korzystających zarówno rodzimy lub krewny zaklejania w przeciwnym kierunku od swojej orientacji i rozmiaru rodzimy w kierunku jego orientacji (wyrównanie nie robi nic w tym kierunku ). To sprawia, że ​​jest wykonawcą średniego szczebla w tym obszarze. Przekazanie Arrangement to po prostu układanie elementów w kolejności. Prawdopodobnie drugi najlepszy występ na tym przełęczy. Średnia wydajność do pomiaru przebiegu i szybkiej wydajności dla przebiegu układu.

Również w odniesieniu do zużycia pamięci, oba obiekty są różne i zajmują różne ilości pamięci, a Grid ma RowDefinitions i ColumnDefinitions, więc to rzeczywiście zawiera więcej obiektów niż Twoje StackPanel

+0

Dzięki za odpowiedź! – Eddie

Powiązane problemy