Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Za pomocą polecenia x:Load można zoptymalizować uruchamianie, tworzenie drzewa wizualnego i użycie pamięci aplikacji XAML. Użycie x:Load ma podobny efekt wizualny do Visibility, różnią się tym, że gdy element nie jest załadowany, jego pamięć zostaje zwolniona, a wewnętrznie mały symbol zastępczy jest używany do oznaczania jego miejsca w drzewie wizualnym.
Element interfejsu użytkownika z atrybutem x:Load można załadować i zwolnić za pomocą kodu lub za pomocą wyrażenia x:Bind. Jest to przydatne, aby zmniejszyć koszty elementów, które są wyświetlane rzadko lub warunkowo. W przypadku użycia atrybutu x:Load w kontenerze, takim jak Grid lub StackPanel, kontener i wszystkie jego elementy podrzędne są ładowane lub rozładowywane jako grupa.
Śledzenie odroczonych elementów przez strukturę XAML dodaje około 600 bajtów do użycia pamięci dla każdego elementu z atrybutem x:Load, aby uwzględnić symbol zastępczy. W związku z tym istnieje możliwość nadmiernego nadużywania tego atrybutu w zakresie, w jakim wydajność rzeczywiście spada. Zalecamy używanie go tylko w elementach, które muszą być ukryte. Jeśli używasz elementu x:Load w kontenerze, obciążenie jest opłacane tylko dla elementu z atrybutem x:Load.
Ważne
Atrybut x:Load jest dostępny w systemie Windows 10 w wersji 1703 (aktualizacja dla twórców). Minimalna wersja przeznaczona dla projektu programu Visual Studio musi mieć wartość Windows 10 Creators Update (10.0, Build 15063), aby można było używać polecenia x:Load.
Użycie atrybutu XAML
<object x:Load="True" .../>
<object x:Load="False" .../>
<object x:Load="{x:Bind Path.to.a.boolean, Mode=OneWay}" .../>
Ładowanie elementów
Istnieje kilka różnych sposobów ładowania elementów:
- Użyj wyrażenia x:Bind , aby określić stan obciążenia. Wyrażenie powinno zwracać wartość true, aby załadować element, i wartość false, aby go rozładować.
- Wywołaj metodę FindName przy użyciu nazwy zdefiniowanej w elemecie .
- Wywołaj metodę GetTemplateChild z nazwą zdefiniowaną w elemecie .
- W wizualizacji VisualState użyj animacji Setter lub Storyboard , która jest przeznaczona dla elementu x:Load.
- Celuj w niezaładowany element w dowolnym scenorysie.
Uwaga / Notatka
Kiedy rozpocznie się tworzenie instancji elementu, zostanie on utworzony w wątku interfejsu użytkownika, co może spowodować, że interfejs użytkownika może się zacinać, jeśli naraz zostanie utworzonych zbyt wiele elementów.
Po utworzeniu odroczonego elementu na dowolny z wymienionych wcześniej sposobów następuje kilka rzeczy:
- Zostanie podniesione zdarzenie Załadowane dla elementu.
- Pole x:Name jest ustawione.
- Wszystkie powiązania x:Bind dla elementu są stosowane.
- Jeśli zarejestrowałeś się, aby otrzymywać powiadomienia o zmianie właściwości w elemencie zawierającym odroczone elementy, powiadomienie zostanie zgłoszone.
Rozładowywanie elementów
Aby zwolnić element:
- Użyj wyrażenia x:Bind, aby określić stan obciążenia. Wyrażenie powinno zwracać true , aby załadować i false , aby odładować element.
- W elemencie Page lub UserControl wywołaj metodę UnloadObject i przekaż odwołanie do obiektu
- Wywołaj obiekt Microsoft.UI.Xaml.Markup.XamlMarkupHelper.UnloadObject i przekaż odwołanie do obiektu
Gdy obiekt zostanie zwolniony, zostanie zastąpiony w drzewie symbolem zastępczym. Wystąpienie obiektu pozostanie w pamięci do czasu wydania wszystkich jego referencji. Interfejs API UnloadObject w kontrolce Page/UserControl jest przeznaczony do wydawania odwołań przechowywanych przez program codegen dla elementu x:Name i x:Bind. Jeśli przechowujesz dodatkowe odwołania w kodzie aplikacji, należy je również zwolnić.
Gdy element zostanie zwolniony, wszystkie stany skojarzone z tym elementem zostaną odrzucone. Dlatego jeśli używasz x:Load jako zoptymalizowanej wersji obsługi widoczności, upewnij się, że wszystkie stany są stosowane za pomocą powiązań lub ponownie stosowane przez kod, gdy zdarzenie Załadowane zostanie wyzwolone.
Restrictions
Ograniczenia dotyczące używania elementu x:Load są następujące:
- Musisz zdefiniować element x:Name , ponieważ musi istnieć sposób późniejszego znalezienia elementu.
- W typach pochodzących z elementu UIElement lub FlyoutBase można używać tylko elementu x:Load.
- Nie można użyć x:Load na elementach głównych w Page, UserControl lub DataTemplate.
- Nie można użyć x:Load na elementach w ResourceDictionary.
- Nie można użyć biblioteki x:Load dla luźnego kodu XAML załadowanego za pomocą biblioteki XamlReader.Load.
- Przeniesienie elementu nadrzędnego spowoduje wyczyszczenie wszystkich elementów, które nie zostały załadowane.
Uwagi
Można użyć x:Load dla zagnieżdżonych komponentów, jednak muszą one być realizowane od najbardziej zewnętrznego elementu do wewnątrz. 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:Load, to w momencie realizacji elementu lub drzewa elementów, wiązania są stosowane aż do bieżącej fazy włącznie. Faza określona dla elementu x:Phase ma wpływ na stan ładowania elementu lub kontroluje go. Gdy element listy jest przetwarzany jako element panoramowania, przetworzone elementy będą zachowywać się w taki sam sposób jak inne aktywne elementy, a skompilowane powiązania ({x:Bind} powiązania) są przetwarzane przy użyciu tych samych reguł, w tym fazowanie.
Ogólne wytyczne dotyczą mierzenia wydajności aplikacji przed i po, aby upewnić się, że uzyskujesz odpowiednią wydajność.
Aby zminimalizować zmiany zachowania (oprócz wydajności) podczas dodawania elementu x:Load do elementu, powiązania x:Bind są obliczane w normalnych czasach, tak jakby żadne elementy nie były używane x:Load. Na przykład powiązania OneTime x:Bind są obliczane podczas ładowania elementu głównego. Jeśli element nie jest zrealizowany w czasie obliczania powiązania x:Bind , wartość obliczeniowa jest zapisywana i stosowana do elementu podczas ładowania. To zachowanie może być zaskakujące, jeśli oczekujesz, że powiązania x:Bind zostaną obliczone podczas realizacji 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);
}
Windows developer