Windows 10 Dev - wydajność XAML
Wydajność aplikacji, taka jak szybkość wyświetlania aplikacji podczas uruchamiania lub nawigacji w celu wyświetlenia następnej zawartości itp., Jest bardzo ważna.
Na wydajność aplikacji może mieć wpływ wiele rzeczy, w tym zdolność aparatu renderującego XAML do analizowania całego kodu XAML, który masz w aplikacji. XAML to bardzo zaawansowane narzędzie do tworzenia interfejsu użytkownika, ale może być bardziej niezawodne dzięki zastosowaniu nowych technik, które są teraz dostępne w aplikacjach systemu Windows 10.
Na przykład w twoich aplikacjach są pewne rzeczy, które chcesz pokazać po załadowaniu strony, a potem nie potrzebujesz ich później. Możliwe jest również, że przy starcie nie trzeba ładować wszystkich elementów UI.
W aplikacjach systemu Windows 10 w języku XAML dodawane są nowe funkcje, które poprawiają wydajność języka XAML.
Wydajność dowolnej aplikacji Universal Windows można poprawić za pomocą następujących technik;
- Renderowanie progresywne
- Odroczone ładowanie
Renderowanie progresywne
W systemie Windows 10 w języku XAML wprowadzono dwie nowe i bardzo fajne funkcje. Oni są -
x: Powiązanie
Jest to nowa składnia wprowadzona w języku XAML używana do wiązania, która działa prawie tak samo, jak Binding składnia tak. x:Bindma dwie kluczowe różnice; zapewnia walidację składni w czasie kompilacji i lepszą wydajność.
X: Faza
Zapewnia możliwość ustalania priorytetów renderowania kontrolek XAML w szablonie danych. Każdy element interfejsu użytkownika może mieć tylko jedną określoną fazę. Jeśli tak, będzie to miało zastosowanie do wszystkich powiązań w elemencie. Jeśli faza nie jest określona, zakłada się, że faza 0.
W aplikacjach Universal Windows Platform (UWP) te dwie nowe funkcje zapewniają poprawę wydajności. Może być również używany w istniejących aplikacjach systemu Windows 8.x, które migrują do systemu Windows 10.
Poniżej podano przykład, w którym obiekty pracowników są powiązane GridView używając x:Bind słowo kluczowe.
<Page
x:Class = "XAMLPhase.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local = "using:XAMLPhase"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d">
<Grid Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}">
<GridView Name = "Presidents" ItemsSource = "{Binding}" Height = "300"
Width = "400" Margin = "50">
<GridView.ItemTemplate>
<DataTemplate x:DataType = "local:Employee">
<StackPanel Orientation = "Horizontal" Margin = "2">
<TextBlock Text = "{x:Bind Name}" Width = "95" Margin = "2" />
<TextBlock Text = "{x:Bind Title}" Width = "95" Margin = "2"
x:Phase = "1"/>
</StackPanel>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
</Grid>
</Page>
W powyższym kodzie XAML x:Phase = "1"jest zdefiniowany za pomocą tytułu. Dlatego w pierwszej fazieName zostaną renderowane, a następnie Title zostaną wyrenderowane.
Podano poniżej Employee class implementacja w C #.
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Windows.UI.Xaml.Controls;
// The Blank Page item template is documented at
http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace XAMLPhase {
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page {
public MainPage() {
this.InitializeComponent();
DataContext = Employee.GetEmployees();
}
}
public class Employee : INotifyPropertyChanged {
private string name;
public string Name {
get { return name; }
set {
name = value;
RaiseProperChanged();
}
}
private string title;
public string Title {
get { return title; }
set {
title = value;
RaiseProperChanged();
}
}
public static Employee GetEmployee() {
var emp = new Employee() {
Name = "Waqas",
Title = "Software Engineer"
};
return emp;
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaiseProperChanged(
[CallerMemberName] string caller = "") {
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(caller));
}
}
public static ObservableCollection<Employee> GetEmployees() {
var employees = new ObservableCollection<Employee>();
employees.Add(new Employee() { Name = "Ali", Title = "Developer" });
employees.Add(new Employee() { Name = "Ahmed", Title = "Programmer" });
employees.Add(new Employee() { Name = "Amjad", Title = "Desiner" });
employees.Add(new Employee() { Name = "Waqas", Title = "Programmer" });
employees.Add(new Employee() { Name = "Bilal", Title = "Engineer" });
employees.Add(new Employee() { Name = "Waqar", Title = "Manager" });
return employees;
}
}
}
Kiedy powyższy kod zostanie wykonany, zobaczysz następujące okno.
Plik X:Phase z x:Bind jest używany do renderowania ListView i GridView elementy stopniowo i poprawiają jakość panoramowania.
Odroczone ładowanie
Ładowanie odroczone to technika, której można użyć w celu zminimalizowania czasu ładowania podczas uruchamiania przez zmniejszenie liczby elementów interfejsu użytkownika XAML podczas uruchamiania aplikacji. Jeśli Twoja aplikacja zawiera 30 elementów UI, a użytkownik nie potrzebuje wszystkich tych elementów na starcie, wszystkie te elementy, które nie są wymagane, mogą zaoszczędzić trochę czasu ładowania poprzez odroczenie.
x:DeferLoadStrategy = "Lazy" opóźnia tworzenie elementu i jego elementów podrzędnych, co skraca czas uruchamiania, ale nieznacznie zwiększa zużycie pamięci.
Element odroczony można zrealizować / utworzyć przez Calling FindName o nazwie, która została zdefiniowana w elemencie.
Po utworzeniu odroczonego elementu wydarzy się kilka rzeczy -
Zostanie zgłoszone zdarzenie Loaded w elemencie.
Wszystkie powiązania elementu zostaną ocenione.
Jeśli aplikacja jest zarejestrowana w celu otrzymywania powiadomień o zmianie właściwości dla właściwości zawierającej odroczone elementy, powiadomienie zostanie zgłoszone.
Poniżej podano przykład, w którym x:DeferLoadStrategy = "Lazy" służy do siatki, która zawiera cztery bloki tekstowe i nie będzie ładowana podczas uruchamiania aplikacji, dopóki jej nie załadujesz.
<Page
x:Class = "UWPDeferredLoading.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local = "using:UWPDeferredLoading"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d">
<Grid Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid x:Name = "DeferredGrid" x:DeferLoadStrategy = "Lazy" Margin = "50">
<Grid.RowDefinitions>
<RowDefinition Height = "Auto" />
<RowDefinition Height = "Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "Auto" />
<ColumnDefinition Width = "Auto" />
</Grid.ColumnDefinitions>
<TextBlock Height = "100" Width = "100" Text = "TextBlock 1" Margin = "0,0,4,4" />
<TextBlock Height = "100" Width = "100" Text = "TextBlock 2"
Grid.Column = "1" Margin = "4,0,0,4" />
<TextBlock Height = "100" Width = "100" Text = "TextBlock 3"
Grid.Row = "1" Margin = "0,4,4,0" />
<TextBlock Height = "100" Width = "100" Text = "TextBlock 4"
Grid.Row = "1" Grid.Column = "1" Margin = "4,4,0,0" />
</Grid>
<Button x:Name = "RealizeElements" Content = "Show Elements"
Click = "RealizeElements_Click" Margin = "50"/>
</Grid>
</Page>
Poniższy program to implementacja zdarzenia kliknięcia, w którym grid jest ładowany na stronie głównej aplikacji.
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
// The Blank Page item template is documented at
http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace UWPDeferredLoading {
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page {
public MainPage() {
this.InitializeComponent();
}
private void RealizeElements_Click(object sender, RoutedEventArgs e) {
this.FindName("DeferredGrid"); // This will realize the deferred grid
}
}
}
Gdy powyższy kod jest zgodny i wykonany, zobaczysz tylko przycisk. PlikTextblocks nie są ładowane podczas uruchamiania.
Teraz, gdy klikniesz Show Elements spowoduje załadowanie bloków tekstu, co poprawi wydajność uruchamiania aplikacji.