Udostępnij przez


Atrybut x:DeferLoadStrategy

Ważne

Począwszy od systemu Windows 10, wersja 1703 (aktualizacja dla twórców), x:DeferLoadStrategy jest zastępowany przez atrybut x:Load. Użycie x:Load="False" jest równoważne z x:DeferLoadStrategy="Lazy", ale umożliwia odciążenie interfejsu użytkownika, jeśli jest to wymagane. Aby uzyskać więcej informacji, zobacz atrybut x:Load .

Aby zoptymalizować wydajność uruchamiania lub tworzenia drzewa aplikacji XAML, możesz użyć x:DeferLoadStrategy="Lazy". W przypadku użycia elementu x:DeferLoadStrategy="Lazy" tworzenie elementu i jego elementów podrzędnych jest opóźnione, co zmniejsza czas uruchamiania i koszty pamięci. Jest to przydatne, aby zmniejszyć koszty elementów, które są wyświetlane rzadko lub warunkowo. Element zostanie zrealizowany, gdy jest przywoływany z kodu lub VisualStateManager.

Jednak śledzenie odroczonych elementów przez platformę XAML dodaje około 600 bajtów do użycia pamięci dla każdego elementu, którego to dotyczy. Im większe drzewo elementów odroczysz, tym więcej czasu uruchamiania zaoszczędzisz, ale kosztem większego obciążenia pamięci. W związku z tym istnieje możliwość nadmiernego nadużywania tego atrybutu w zakresie, w jakim wydajność spada.

Użycie atrybutu XAML

<object x:DeferLoadStrategy="Lazy" .../>

Uwagi

Ograniczenia dotyczące używania klasy x:DeferLoadStrategy to:

Istnieje kilka różnych sposobów realizacji odroczonych elementów:

  • Wywołaj metodę FindName przy użyciu nazwy zdefiniowanej w elemecie .
  • Wywołaj metodę GetTemplateChild z nazwą zdefiniowaną w elemecie .
  • W VisualState użyj Setter lub animacji Storyboard, która jest przeznaczona dla odroczonego elementu.
  • Określ docelowy odroczony element w dowolnym Storyboardzie.
  • Użyj powiązania, które jest przeznaczone dla odroczonego elementu.

UWAGA: Po rozpoczęciu tworzenia wystąpienia elementu jest ono realizowane w wątku interfejsu użytkownika, co może spowodować zakłócenia w działaniu interfejsu użytkownika, jeśli zbyt wiele elementów zostanie utworzonych jednocześnie.

Po utworzeniu odroczonego elementu na dowolny z wymienionych wcześniej sposobów następuje kilka rzeczy:

  • Zostanie podniesione zdarzenie Załadowane dla elementu.
  • Wszystkie powiązania elementu są oceniane.
  • Jeśli zarejestrowałeś się, aby otrzymywać powiadomienia o zmianie właściwości w elemencie zawierającym odroczone elementy, powiadomienie zostanie zgłoszone.

Można zagnieżdżać odroczone elementy, jednak muszą być wykonywane od najbardziej zewnętrznego elementu do wewnętrznego.  Jeśli spróbujesz zrealizować element podrzędny przed zrealizowaniem elementu nadrzędnego, zostanie zgłoszony wyjątek.

Zazwyczaj zalecamy odroczenie elementów, które nie są widoczne w pierwszej ramce. Dobrą wskazówką przy szukaniu kandydatów do odroczenia jest wyszukiwanie elementów, które są tworzone ze zwiniętą widocznością. Ponadto interfejs użytkownika wyzwalany przez interakcję użytkownika to dobre miejsce do wyszukiwania elementów, które można odroczyć.

Uważaj na odroczenie elementów w kodzie ListView, ponieważ skróci czas uruchamiania, ale może również zmniejszyć wydajność przesuwania w zależności od tego, co tworzysz. Jeśli chcesz zwiększyć wydajność przewijania, zobacz dokumentację rozszerzenia znaczników {x:Bind} i atrybut x:Phase.

Jeśli atrybut x:Phase jest używany w połączeniu z x:DeferLoadStrategy, w momencie, gdy element lub drzewo elementów zostaje zrealizowane, powiązania są stosowane aż do i włącznie z bieżącą fazą. Określona faza dla x:Phase nie ma wpływu ani nie kontroluje odroczenia elementu. Gdy element listy jest ponownie użyty w ramach przesuwania, zrealizowane elementy zachowują się w taki sam sposób, jak inne aktywne elementy, a skompilowane powiązania (powiązania {x:Bind}) są przetwarzane przy użyciu tych samych reguł, w tym fazowania.

Ogólne wytyczne dotyczą mierzenia wydajności aplikacji przed i po, aby upewnić się, że uzyskujesz odpowiednią wydajność.

Example

<Grid x:Name="DeferredGrid" x:DeferLoadStrategy="Lazy">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>

    <Rectangle Height="100" Width="100" Fill="#F65314" Margin="0,0,4,4" />
    <Rectangle Height="100" Width="100" Fill="#7CBB00" Grid.Column="1" Margin="4,0,0,4" />
    <Rectangle Height="100" Width="100" Fill="#00A1F1" Grid.Row="1" Margin="0,4,4,0" />
    <Rectangle Height="100" Width="100" Fill="#FFBB00" Grid.Row="1" Grid.Column="1" Margin="4,4,0,0" />
</Grid>
<Button x:Name="RealizeElements" Content="Realize Elements" Click="RealizeElements_Click"/>
private void RealizeElements_Click(object sender, RoutedEventArgs e)
{
    // This will realize the deferred grid.
    this.FindName("DeferredGrid");
}