Sdílet prostřednictvím


x:Load – atribut

X :Load můžete použít k optimalizaci spouštění, vytváření vizuálního stromu a využití paměti aplikace XAML. Použití x:Load má podobný vizuální efekt jako Viditelnost, s tím rozdílem, že když prvek není načten, uvolní se jeho paměť a interně se použije malý zástupný symbol k označení jeho místa ve vizuálním stromu.

Element uživatelského rozhraní s atributem x:Load lze načíst a uvolnit prostřednictvím kódu nebo pomocí výrazu x:Bind . To je užitečné ke snížení nákladů na prvky, které se zobrazují zřídka nebo podmíněně. Když použijete x:Load na kontejner, jako je Grid nebo StackPanel, kontejner a všichni jeho potomci se načtou nebo uvolní jako skupina.

Sledování odložených elementů rámcem XAML přidává do paměťového využití přibližně 600 bajtů pro každý prvek s atributem x:Load, aby se vyvážil zástupný symbol. Proto je možné tento atribut přetěžovat v rozsahu, kdy se výkon skutečně snižuje. Doporučujeme, abyste ho používali jenom u prvků, které musí být skryté. Pokud v kontejneru použijete x:Load, platí se režie pouze za prvek s atributem x:Load.

Důležité

Atribut x:Load je k dispozici od Windows 10 verze 1703 (Creators Update). Minimální verze cílená vaším projektem sady Visual Studio musí být Windows 10 Creators Update (10.0, build 15063), aby bylo možné použít x:Load.

Použití atributu XAML

<object x:Load="True" .../>
<object x:Load="False" .../>
<object x:Load="{x:Bind Path.to.a.boolean, Mode=OneWay}" .../>

Načítání elementů

Prvky můžete načíst několika různými způsoby:

  • Použijte výraz x:Bind k určení stavu načtení. Výraz by měl vrátit true, aby se načetl, a false, aby se prvek odznačil.
  • 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 element x:Load.
  • Zaměřte se na uvolněný prvek v libovolném Storyboard.

Poznámka:

Jakmile se zahájí instance elementu, vytvoří se ve vlákně uživatelského rozhraní, takže může způsobit, že uživatelské rozhraní začne zadrhávat, pokud se najednou vytvoří příliš mnoho.

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.
  • Pole pro x:Name je nastavené.
  • Všechny vazby x:Bind v elementu se použijí.
  • 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.

Uvolnění prvků

Uvolnění elementu:

  • K určení stavu načtení použijte výraz x:Bind. Výraz by měl vrátit true, aby se načetl, a false, aby se prvek uvolnil.
  • Na stránce nebo UserControl volejte UnloadObject a předejte odkaz na objekt.
  • Zavolejte Microsoft.UI.Xaml.Markup.XamlMarkupHelper.UnloadObject a předejte odkaz na objekt

Když se objekt odstraní, nahradí se ve stromu zástupným prvkem. Instance objektu zůstane v paměti, dokud nebudou uvolněny všechny odkazy. Rozhraní API UnloadObject na Page/UserControl je navrženo tak, aby uvolnilo odkazy uchovávané generovaným kódem pro x:Name a x:Bind. Pokud máte v kódu aplikace další odkazy, bude potřeba je také uvolnit.

Při uvolnění elementu se veškerý stav přidružený k elementu zahodí, takže pokud použijete x:Load jako optimalizovanou verzi viditelnosti, ujistěte se, že se veškerý stav použije prostřednictvím vazeb, nebo je znovu použit kódem při spuštění načtené události.

Restrictions

Omezení pro použití x:Load jsou:

  • Musíte definovat x:Name pro prvek, protože musí existovat způsob, jak najít prvek později.
  • Můžete použít pouze x:Load u typů odvozených z UIElement nebo FlyoutBase.
  • Nelze použít x:Load u kořenových prvků na stránce, UserControl nebo DataTemplate.
  • V ResourceDictionary nelze použít elementy x:Load.
  • Nelze použít x:Load na nezapouzdřený XAML načtený pomocí XamlReader.Load.
  • Přesunutí nadřazeného elementu vymaže všechny prvky, které nebyly načteny.

Poznámky

Můžete použít x:Load u vnořených prvků, ale musí být realizovány počínaje od nejvnějšího prvku.  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:Load, pak, když je realizován prvek nebo strom prvků, vazby se použijí až do včetně této fáze. Fáze zadaná pro x:Phase ovlivňuje nebo řídí stav načítání prvku. Pokud je položka seznamu recyklována jako součást posouvání, prvky, které byly realizovány, se budou chovat stejně jako ostatní aktivní prvky a kompilované vazby ({x:Bind} vazby) se zpracovávají podle stejných pravidel, včetně fázová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.

Chcete-li minimalizovat změny chování (kromě výkonu) při přidávání x:Load do elementu, jsou vazby x:Bind vypočteny v normálních časech, jako by nebyly použity žádné prvky x:Load. Například vazby OneTime x:Bind se počítají při načtení kořenového prvku. Pokud není prvek realizován v době, když se vypočítává vazba x:Bind, je vypočítaná hodnota uložena a použita na prvek při jeho načtení. Toto chování může být překvapení, pokud jste očekávali, že vazby x:Bind se vypočítají při realizaci elementu.

Example

<StackPanel>
    <Grid x:Name="DeferredGrid" x:Load="False">
        <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="Orange" Margin="0,0,4,4"/>
        <Rectangle Height="100" Width="100" Fill="Green" Grid.Column="1" Margin="4,0,0,4"/>
        <Rectangle Height="100" Width="100" Fill="Blue" Grid.Row="1" Margin="0,4,4,0"/>
        <Rectangle Height="100" Width="100" Fill="Gold" Grid.Row="1" Grid.Column="1" Margin="4,4,0,0"
                   x:Name="one" x:Load="{x:Bind (x:Boolean)CheckBox1.IsChecked, Mode=OneWay}"/>
        <Rectangle Height="100" Width="100" Fill="Silver" Grid.Row="1" Grid.Column="1" Margin="4,4,0,0"
                   x:Name="two" x:Load="{x:Bind Not(CheckBox1.IsChecked), Mode=OneWay}"/>
    </Grid>

    <Button Content="Load elements" Click="LoadElements_Click"/>
    <Button Content="Unload elements" Click="UnloadElements_Click"/>
    <CheckBox x:Name="CheckBox1" Content="Swap Elements" />
</StackPanel>
// This is used by the bindings between the rectangles and check box.
private bool Not(bool? value) { return !(value==true); }

private void LoadElements_Click(object sender, RoutedEventArgs e)
{
    // This will load the deferred grid, but not the nested
    // rectangles that have x:Load attributes.
    this.FindName("DeferredGrid"); 
}

private void UnloadElements_Click(object sender, RoutedEventArgs e)
{
     // This will unload the grid and all its child elements.
     this.UnloadObject(DeferredGrid);
}