Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Viktigt!
Från och med Windows 10 version 1703 (Creators Update) ersätts x:DeferLoadStrategy med attributet x:Load. Användning av x:Load="False" motsvarar x:DeferLoadStrategy="Lazy", men ger möjlighet att avlasta användargränssnittet vid behov. Mer information finns i attributet x:Load .
Du kan använda x:DeferLoadStrategy="Lazy" för att optimera start- eller trädskapandeprestanda för din XAML-app. När du använder x:DeferLoadStrategy="Lazy" fördröjs skapandet av ett element och dess underordnade element, vilket minskar starttiden och minneskostnaderna. Detta är användbart för att minska kostnaderna för element som visas sällan eller villkorligt. Elementet realiseras när det refereras till från kod eller VisualStateManager.
Spårningen av uppskjutna element av XAML-ramverket lägger dock till cirka 600 byte till minnesanvändningen för varje element som påverkas. Ju större elementträd du skjuter upp, desto mer starttid sparar du, men på bekostnad av ett större minnesavtryck. Därför är det möjligt att överanvända det här attributet i den utsträckning som prestandan minskar.
XAML-attributanvändning
<object x:DeferLoadStrategy="Lazy" .../>
Anmärkningar
Begränsningarna för användning av x:DeferLoadStrategy är:
- Du måste definiera ett x:Name för elementet, eftersom det måste finnas ett sätt att hitta elementet senare.
- Du kan bara skjuta upp typer som härleds från UIElement eller FlyoutBase.
- Du kan inte skjuta upp rotelement i en sida, en UserControl eller ett DataTemplate.
- Du kan inte skjuta upp element i en ResourceDictionary.
- Du kan inte skjuta upp lös XAML som lästs in med XamlReader.Load.
- Om du flyttar ett överordnat element rensas alla element som inte har realiserats.
Det finns flera olika sätt att realisera de uppskjutna elementen:
- Anropa FindName med det namn som du definierade för elementet.
- Anropa GetTemplateChild med det namn som du definierade för elementet.
- I en VisualState använder du en Setter eller en Storyboard-animering som riktar sig mot det uppskjutna elementet.
- Fokusera på det uppskjutna elementet i en Storyboard.
- Använd en bindning som riktar sig till det uppskjutna elementet.
Obs! När instansieringen av ett element har startats skapas det i användargränssnittstråden, så det kan få användargränssnittet att hacka om för mycket skapas på en gång.
När ett uppskjutet element har skapats på något av de sätt som anges tidigare händer flera saker:
- Händelsen Inläst på elementet aktiveras.
- Bindningar i elementet utvärderas.
- Om du har registrerat dig för att ta emot aviseringar om en egenskapsändring på egendomen som innehåller de uppskjutna elementen, genereras aviseringen.
Du kan kapsla fördröjda element, men de måste realiseras från det yttersta elementet inåt. Om du försöker förverkliga ett underordnat element innan det överordnade elementet har realiserats utlöses ett undantag.
Normalt rekommenderar vi att du skjuter upp element som inte kan visas i den första ramen. En bra riktlinje för att hitta kandidater som ska skjutas upp är att leta efter element som skapas med komprimerad synlighet. Dessutom är användargränssnitt som utlöses av användarinteraktion ett bra ställe att leta efter element som du kan skjuta upp.
Var försiktig med att skjuta upp element i en ListView eftersom det minskar starttiden, men kan också minska panoreringsprestandan beroende på vad du skapar. Om du vill förbättra panoreringsprestandan, läs dokumentationen om {x:Bind}-markeringstillägget och x:Phase-attributet.
Om attributet x:Phase används tillsammans med x:DeferLoadStrategy tillämpas bindningarna upp till och med den aktuella fasen när ett element eller ett elementträd realiseras. Fasen som anges för x:Phase påverkar inte eller styr uppskjutning av elementet. När ett listobjekt återanvänds som en del av panoreringen beter sig realiserade element på samma sätt som andra aktiva element och kompilerade bindningar ({x:Bind} bindningar bearbetas med samma regler, inklusive fasning.
En allmän riktlinje är att mäta appens prestanda före och efter för att se till att du får den prestanda du vill ha.
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");
}
Windows developer