Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Projekt aplikacji WPF może mieć wpływ na wydajność, tworząc niepotrzebne obciążenie podczas obliczania układu i weryfikowania odwołań do obiektów. Konstrukcja obiektów, szczególnie w czasie wykonywania, może mieć wpływ na charakterystykę wydajności aplikacji.
Ten temat zawiera zalecenia dotyczące wydajności w tych obszarach.
Układ
Termin "przebieg układu" opisuje proces mierzenia i rozmieszczania członków kolekcji obiektu wywodzącego się z Panel, a następnie wyświetlania ich na ekranie. Przejście układu to proces intensywnie wymagający matematycznych obliczeń — im większa liczba elementów podrzędnych w kolekcji, tym większa liczba wymaganych obliczeń. Na przykład za każdym razem, gdy obiekt podrzędny UIElement w kolekcji zmienia swoje położenie, może uruchomić nową ścieżkę w systemie układu. Ze względu na ścisłą relację między cechami obiektu i zachowaniem układu ważne jest zrozumienie typu zdarzeń, które mogą wywoływać system układu. Aplikacja będzie działać lepiej, zmniejszając jak najwięcej niepotrzebnych wywołań układu.
System układu kończy dwa przebiegi dla każdego podrzędnego elementu w kolekcji: przebieg miary i rozmieszczania. Każdy obiekt podrzędny zapewnia własną zastąpioną implementację metod Measure i Arrange w celu zapewnienia własnego zachowania układu. W najprostszej formie układ to system rekursywny, który prowadzi do ustalenia rozmiaru, położenia i narysowania elementu na ekranie.
Obiekt podrzędny UIElement rozpoczyna proces układu, w którym najpierw mierzone są jego właściwości podstawowe.
Właściwości FrameworkElement obiektu, które są powiązane z rozmiarem, takimi jak Width, Heighti Margin, są oceniane.
Specyficzna logika dla Paneljest stosowana, taka jak właściwość Dock dla DockPanellub właściwość Orientation dla StackPanel.
Zawartość jest rozmieszczana lub umieszczona po zmierzeniu wszystkich obiektów podrzędnych.
Kolekcja obiektów podrzędnych jest rysowana na ekranie.
Proces przekazywania układu jest wywoływany ponownie, jeśli wystąpi którakolwiek z następujących akcji:
Obiekt podrzędny jest dodawany do kolekcji.
LayoutTransform jest stosowany do obiektu podrzędnego.
Metoda UpdateLayout jest wywoływana dla obiektu podrzędnego.
Gdy następuje zmiana wartości właściwości zależności, której zmiana jest oznaczona przez metadane wpływające na przebieg procesu mierzenia lub rozmieszczania.
Korzystanie z najbardziej wydajnego panelu, jeśli jest to możliwe
Złożoność procesu układu jest bezpośrednio oparta na zachowaniu układu elementów pochodzących od Panel, które używasz. Na przykład kontrolka Grid lub StackPanel zapewnia znacznie więcej funkcji niż kontrolka Canvas. Cena tego większego wzrostu funkcjonalności jest większym wzrostem kosztów wydajności. Jeśli jednak nie potrzebujesz funkcji zapewnianych przez Grid kontrolkę, należy użyć mniej kosztownych alternatyw, takich jak Canvas lub panel niestandardowy.
Aby uzyskać więcej informacji, zobacz Omówienie paneli.
Aktualizacja zamiast zastępowania elementu RenderTransform
Może być możliwe zaktualizowanie Transform zamiast zastępowania jej jako wartości właściwości RenderTransform. Dotyczy to szczególnie scenariuszy obejmujących animację. Aktualizując istniejącą Transform, unikasz inicjowania niepotrzebnego obliczania układu.
Twórz swoje drzewo Top-Down
Po dodaniu lub usunięciu węzła z drzewa logicznego unieważnienia właściwości są wywoływane na obiekcie nadrzędnym węzła i wszystkich jego elementach podrzędnych. W związku z tym należy zawsze przestrzegać wzorca konstrukcji od góry, aby uniknąć kosztów niepotrzebnych unieważnień w węzłach, które zostały już zweryfikowane. W poniższej tabeli przedstawiono różnicę w szybkości wykonania między tworzeniem drzewa od góry do dołu a od dołu do góry, gdzie drzewo ma 150 poziomów z pojedynczym TextBlock i DockPanel na każdym poziomie.
| Akcja | Budowanie drzewa (w ms) | Render — obejmuje budowę drzewa (w ms) |
|---|---|---|
| Dolna góra | 366 | 454 |
| Od góry do dołu | 11 | 96 |
W poniższym przykładzie kodu pokazano, jak utworzyć drzewo hierarchiczne od góry do dołu.
private void OnBuildTreeTopDown(object sender, RoutedEventArgs e)
{
TextBlock textBlock = new TextBlock();
textBlock.Text = "Default";
DockPanel parentPanel = new DockPanel();
DockPanel childPanel;
myCanvas.Children.Add(parentPanel);
myCanvas.Children.Add(textBlock);
for (int i = 0; i < 150; i++)
{
textBlock = new TextBlock();
textBlock.Text = "Default";
parentPanel.Children.Add(textBlock);
childPanel = new DockPanel();
parentPanel.Children.Add(childPanel);
parentPanel = childPanel;
}
}
Private Sub OnBuildTreeTopDown(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim textBlock As New TextBlock()
textBlock.Text = "Default"
Dim parentPanel As New DockPanel()
Dim childPanel As DockPanel
myCanvas.Children.Add(parentPanel)
myCanvas.Children.Add(textBlock)
For i As Integer = 0 To 149
textBlock = New TextBlock()
textBlock.Text = "Default"
parentPanel.Children.Add(textBlock)
childPanel = New DockPanel()
parentPanel.Children.Add(childPanel)
parentPanel = childPanel
Next i
End Sub
Aby uzyskać więcej informacji na temat drzewa logicznego, sprawdź sekcję Drzewa w WPF.
Zobacz także
.NET Desktop feedback