x:DeferLoadStrategy je atribut

Důležité

Počínaje Windows 10 verze 1703 (Creators Update), x:DeferLoadStrategy je nahrazen atributem x:Load. Použití x:Load="False" je ekvivalentní x:DeferLoadStrategy="Lazy", ale poskytuje možnost uvolnit uživatelské rozhraní v případě potřeby. Další informace najdete v atributu x:Load .

K optimalizaci výkonu spouštění nebo vytváření stromu aplikace XAML můžete použít x:DeferLoadStrategy="Lazy" . Při použití x:DeferLoadStrategy="Lazy", vytvoření prvku a jeho podřízených položek je zpožděno, což snižuje čas spuštění a náklady na paměť. To je užitečné ke snížení nákladů na prvky, které se zobrazují zřídka nebo podmíněně. Prvek bude realizován, když je na něj odkazováno z kódu nebo z VisualStateManager.

Sledování odložených elementů podle architektury XAML však přidává do využití paměti pro každý ovlivněný prvek přibližně 600 bajtů. Čím větší strom prvků odložíte, tím více doby spuštění ušetříte, ale za cenu většího využití paměti. Proto je možné tento atribut přetěžovat v rozsahu, kdy se výkon snižuje.

Použití atributu XAML

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

Poznámky

Omezení použití x:DeferLoadStrategy jsou:

  • Musíte definovat x:Name pro prvek, protože musí existovat způsob, jak najít prvek později.
  • Odložit lze pouze typy odvozené od UIElement nebo FlyoutBase.
  • Kořenové elementy nelze odložit na stránce, UserControl nebo DataTemplate.
  • V ResourceDictionary nelze odložit elementy.
  • Volný kód XAML načtený pomocí XamlReader.Load nelze odložit.
  • Přesunutí nadřazeného prvku vymaže všechny prvky, které nebyly dosaženy.

Existuje několik různých způsobů, jak realizovat odložené prvky:

  • Zavolejte FindName s názvem, který jste definovali na elementu.
  • Zavolejte GetTemplateChild s názvem, který jste definovali na elementu.
  • Ve VisualState použijte animaci Setter nebo Storyboard , která cílí na odložený prvek.
  • Zaměřte se na odložený prvek v libovolném Storyboardu.
  • Použijte vazbu, která cílí na odložený prvek.

POZNÁMKA: Jakmile začne vytváření instance elementu, vytvoří se ve vlákně UI, takže může způsobit, že se UI bude zadrhávat, pokud se naráz vytvoří příliš mnoho elementů.

Jakmile se odložený prvek vytvoří některým z výše uvedených způsobů, stane se několik věcí:

  • Na elementu je vyvolána událost Loaded.
  • Vyhodnocují se všechny vazby v elementu.
  • Pokud jste se zaregistrovali k příjmu oznámení o změně vlastností u objektu obsahujícího odložené prvky, oznámení bude vyvoláno.

Odložené prvky můžete vnořit, ale musí být prováděny od nejvzdálenějšího vnějšího prvku dovnitř.  Pokud se pokusíte realizovat podřízený prvek před realizací nadřazeného prvku, vyvolá se výjimka.

Obvykle doporučujeme odložit prvky, které nelze zobrazit v prvním rámečku. Dobrým vodítkem pro hledání kandidátů, které mají být odloženy, je hledat prvky, které se vytvářejí sbalenou viditelností. Také uživatelské rozhraní aktivované interakcí uživatele je dobrým místem k vyhledání prvků, které můžete odložit.

Dávejte pozor na odložení prvků v ListView, protože sníží čas spuštění, ale může také snížit výkon posouvání v závislosti na tom, co vytváříte. Pokud chcete zlepšit výkon posouvání, přečtěte si dokumentaci k rozšíření značek {x:Bind} a atributu x:Phase.

Pokud je atribut x:Phase použit ve spojení s x:DeferLoadStrategy, pak, když je realizován prvek nebo strom elementu, vazby se použijí včetně aktuální fáze. Fáze zadaná pro x:Phase nemá vliv ani neřídí odložení prvku. Pokud je položka seznamu recyklována jako součást posouvání, realizované prvky se chovají stejným způsobem jako ostatní aktivní prvky a kompilované vazby ({x:Bind} vazby) se zpracovávají pomocí stejných pravidel, včetně postupného zpracování.

Obecným vodítkem je měření výkonu aplikace před a po tom, abyste měli jistotu, že získáváte požadovaný výkon.

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");
}