Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Návrh aplikace WPF může ovlivnit jeho výkon vytvořením zbytečné režie při výpočtu rozložení a ověřování odkazů na objekty. Konstrukce objektů, zejména v době běhu, může ovlivnit charakteristiky výkonu vaší aplikace.
Toto téma poskytuje doporučení k výkonu v těchto oblastech.
Rozložení
Pojem "průchod rozložení" popisuje proces měření a uspořádání členů kolekce dětí, odvozených z objektu Panel, a jejich následné vykreslení na obrazovku. Průchod rozložením je matematicky náročný proces – čím větší je počet dětí v kolekci, tím více výpočtů je třeba provést. Například pokaždé, když podřízený objekt UIElement v kolekci změní svou pozici, může aktivovat nový průchod systémem rozložení. Vzhledem k úzkému vztahu mezi vlastnostmi objektu a chováním rozložení je důležité pochopit typ událostí, které mohou vyvolat systém rozložení. Tím, že co nejvíce snížíte zbytečná vyvolání layout passu, vaše aplikace bude fungovat lépe.
Systém rozložení dokončí dva průchody pro každý podřízený v kolekci: měřicí průchod a uspořádací průchod. Každý podřízený objekt poskytuje svou vlastní překrytou implementaci metod Measure a Arrange, aby poskytoval své vlastní specifické chování rozložení. V nejjednodušším rozložení je rekurzivní systém, který vede k velikosti, umístění a vykreslení prvku na obrazovce.
Podřízený objekt UIElement zahájí proces rozložení tím, že jsou nejprve měřeny jeho hlavní vlastnosti.
Vyhodnocují se vlastnosti FrameworkElement objektu, které souvisejí s velikostí, například Width, Heighta Margin.
Panelje aplikována specifická logika, jako je vlastnost Dock objektu DockPanelnebo vlastnost Orientation objektu StackPanel.
Obsah se uspořádá nebo umístí po měření všech podřízených objektů.
Kolekce podřízených objektů je nakreslena na obrazovku.
Proces předání rozložení se znovu vyvolá, pokud dojde k některé z následujících akcí:
Do kolekce se přidá podřízený objekt.
Na podřízený objekt se použije LayoutTransform.
Metoda UpdateLayout je volána pro podřízený objekt.
Když dojde ke změně hodnoty vlastnosti závislosti, která je označena metadaty ovlivňujícími fáze měření nebo uspořádání.
Použití nejúčinnějšího panelu tam, kde je to možné
Složitost procesu rozložení je přímo závislá na chování rozložení Panel-odvozených prvků, které používáte. Například ovládací prvek Grid nebo StackPanel poskytuje mnohem více funkcí než ovládací prvek Canvas. Cena za toto větší zvýšení funkčnosti je vyšší zvýšení nákladů na výkon. Pokud ale nepotřebujete funkce, které ovládací prvek Grid poskytuje, měli byste použít méně nákladné alternativy, například Canvas nebo vlastní panel.
Další informace viz Přehled panelů.
Aktualizovat místo nahrazení RenderTransformu
Možná budete moci aktualizovat Transform místo toho, abyste ho nahradili jako hodnotu vlastnosti RenderTransform. To platí zejména ve scénářích, které zahrnují animaci. Aktualizací existujícího Transformzabráníte zahájení nepotřebného výpočtu rozložení.
Postav si svůj strom Top-Down
Při přidání nebo odebrání uzlu z logického stromu dojde ke zneplatnění vlastností u nadřazeného uzlu a všech jeho podřízených uzlů. V důsledku toho by se měl vždy dodržovat vzor konstrukce shora dolů, aby se zabránilo nákladům na zbytečné zneplatnění na uzlech, které už byly ověřeny. Následující tabulka ukazuje rozdíl v rychlosti zpracování mezi sestavením stromu shora dolů versus zdola nahoru, kde strom je hluboký 150 úrovní s jedním TextBlock a DockPanel na každé úrovni.
| Akce | Stavba stromu (v ms) | Render—zahrnuje vytváření stromů (v ms) |
|---|---|---|
| Zespodu nahoru | 366 | 454 |
| Shora dolů | 11 | 96 |
Následující příklad kódu ukazuje, jak vytvořit strom shora dolů.
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
Další informace o logickém stromu naleznete v tématu Stromy ve WPF.
Viz také
.NET Desktop feedback