x:Load attribútum

Az x:Load használatával optimalizálhatja az XAML-alkalmazás indítási, vizualizációs fa létrehozását és memóriahasználatát. Az x:Load használata a Láthatósághoz hasonló vizualizációs hatással rendelkezik, azzal a kivétellel, hogy ha az elem nincs betöltve, a memóriája felszabadul, és belsőleg egy kis helyőrzővel jelöli meg a helyét a vizualizációfán.

Az x:Load attribútumú felhasználói felületi elem kóddal vagy x:Kötés kifejezéssel tölthető be és távolítható el. Ez hasznos a ritkán vagy feltételesen megjelenített elemek költségeinek csökkentéséhez. Ha x:Load-ot használ egy olyan tárolón, mint a Grid vagy a StackPanel, a tároló és annak összes gyermeke csoportként betöltődik vagy eltávolításra kerül.

A halasztott elemek XAML-keretrendszer általi nyomon követése körülbelül 600 bájtot ad hozzá a memóriahasználathoz az x:Load attribútummal ellátott minden egyes elemhez, hogy figyelembe vegye a helyőrzőt. Ezért ezt az attribútumot túl lehet adni olyan mértékben, amennyire a teljesítmény ténylegesen csökken. Azt javasoljuk, hogy csak olyan elemeken használja, amelyeket el kell rejteni. Ha x:Terhelést használ egy tárolón, akkor a többletterhelést csak az x:Load attribútummal rendelkező elemért fizeti a rendszer.

XAML-attribútumok használata

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

Elemek betöltése

Az elemek betöltésének többféle módja is van:

  • A terhelési állapot megadásához használjon x:Bind kifejezést. A kifejezésnek igaznak kell lennie a betöltéshez, és hamisnak kell lennie az elem eltávolításához. Ha a(z) x:Load elemben a(z) x:Bind elemet használja, ne állítsa a(z) x:Name értékét ugyanarra az azonosítóra, mint a kötési útvonalét; ellenkező esetben az XAML-fordító hibát jelez.
  • Hívja meg a FindName elemet az elemen definiált névvel.
  • Hívja meg a GetTemplateChild metódust az elemen definiált névvel.
  • VisualState-ban használjon setter vagy storyboard animációt, amely az x:Load elemet célozza meg.
  • A Storyboard-ban lévő kiürített elem megcélzása.

Megjegyzés:

Miután egy elem példányosítása elindult, a felhasználói felületen jön létre, így a felhasználói felület akadozik, ha túl sok jön létre egyszerre.

Ha a korábban felsorolt módok bármelyikében halasztott elemet hoz létre, számos dolog történik:

  • Az elem betöltött eseménye aktiválódik.
  • Az x:Name mező be van állítva.
  • Minden x:Bind kötést alkalmaznak az elemen.
  • Ha regisztrált arra, hogy a késleltetett elemet tartalmazó tulajdonságon tulajdonságmódosítási értesítéseket kapjon, az értesítés megjelenik.

Elemek kirakodása

Elem kirakodása:

  • A terhelési állapot megadásához használjon x:Bind kifejezést. A kifejezésnek igaznak kell lennie a betöltéshez, és hamisnak kell lennie az elem eltávolításához.
  • Egy lapon vagy a UserControlban hívja meg a UnloadObject parancsot , és adja meg az objektumhivatkozást
  • Hívja meg a Microsoft.UI.Xaml.Markup.XamlMarkupHelper.UnloadObject parancsot , és adja meg az objektumhivatkozást

Ha egy objektumot eltávolít, a rendszer lecseréli azt a fára egy helyőrzővel. Az objektumpéldány az összes hivatkozás kiadásáig a memóriában marad. A Page/UserControl -on található UnloadObject API az x:Name és az x:Bind kódgen által tárolt hivatkozások kiadására lett tervezve. Ha további hivatkozásokat tárol az alkalmazáskódban, azokat is közzé kell tenni.

Amikor egy elemet eltávolítanak, az elemhez társított összes állapot el lesz vetve. Ezért, ha az x:Betöltést Láthatóság optimalizált verziójaként használja, győződjön meg róla, hogy minden állapot kötéseken keresztül van alkalmazva, vagy a kód újra alkalmazza, amikor a Loaded esemény elindul.

Restrictions

Az x:Load használatára vonatkozó korlátozások a következők:

Megjegyzés:

WinUI 3 (Windows App SDK):Az ablak nem a FrameworkElementből származik, ezért nincs metódusaFindName. A WinUI 3-ban a FindName nem működik a x:Load elemek létrehozására, ha az XAML-gyökér egy Window, még akkor sem, ha a FindName metódust egy olyan FrameworkElement objektumon hívja meg, amely a Window leszármazottja. Használjon kifejezést x:Bind a terhelési állapot szabályozásához. További információ: microsoft-ui-xaml #9842.

Megjegyzés:

C++/WinRT (WinUI 2/ UWP): Ha ugyanazt az elemet használja x:Loadx:Bind , fordítási hibát okozhat. Részletekért és a kerülőmegoldásért lásd: microsoft-ui-xaml #7579.

Megjegyzés:

C++/WinRT:FindName nem tölt be újra olyan elemet, amely korábban már ki lett ürítve.UnloadObject Használjon kifejezést x:Bind a terhelési állapot szabályozásához.

Megjegyzések

Az x:Load attribútumot használhatja a beágyazott elemeknél, de ezeket a legkülsőbb elemtől befelé haladva kell betölteni.  Ha egy gyermekelemet a szülő megvalósítása előtt próbál megvalósítani, kivétel keletkezik.

Általában azt javasoljuk, hogy halasztsa el azokat az elemeket, amelyek nem láthatók az első keretben. A késleltetni kívánt jelöltek megkereséséhez jó útmutató az összecsukott láthatósággal létrehozott elemek keresése. Emellett a felhasználói interakció által aktivált felhasználói felület jó hely a késleltethető elemek keresésére.

Ügyeljen arra, hogy legyen óvatos az elemek késleltetésével a ListView-ban, mivel növeli az indítási időt, de attól függően, hogy mit hoz létre, csökkentheti a pásztázási teljesítményt is. Ha növelni szeretné a pásztázó teljesítményt, tekintse meg a {x:Bind} jelölőbővítményt és az x:Phase attribútum dokumentációját.

Ha az x:Phase attribútumot az x:Load attribútummal együtt használja, akkor egy elem vagy elemfa megvalósításakor a kötések az aktuális fázisra lesznek alkalmazva, beleértve az aktuális fázist is. Az x:Phase paraméterhez megadott fázis befolyásolja vagy szabályozza az elem betöltési állapotát. Amikor egy listaelemet újrafeldolgoznak a pásztázás részeként, a felismert elemek ugyanúgy fognak viselkedni, mint a többi aktív elem, és a lefordított kötések ({x:Bind} kötések) feldolgozása ugyanazokkal a szabályokkal történik, beleértve a fokozatos műveletet is.

Általános útmutató az alkalmazás teljesítményének mérése előtt és után, hogy biztosan megkapja-e a kívánt teljesítményt.

Az x:Load elemhez való hozzáadásakor a viselkedés változásainak minimalizálása érdekében (a teljesítményen kívül) az x:Bind kötéseket a normál időpontban számítják ki, mintha egyetlen elem sem használná az x:Load-ot. Például a OneTime x:Bind kötések kiszámítása akkor történik, amikor a gyökérelem betöltődik. Ha az elem annak idején nem valósul meg, amikor az x:Bind kötés kiszámításra kerül, akkor a számított érték mentésre kerül és alkalmazva lesz az elemre, amikor az betöltődik. Ez a viselkedés meglepő lehet, ha azt várta, hogy a x:Bind kötéseket az elem létrejöttekor számítják ki.

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