Optimalizace výkonu: Zdroje aplikace

WPF umožňuje sdílet prostředky aplikace, abyste mohli podporovat konzistentní vzhled nebo chování napříč podobnými prvky. Toto téma obsahuje několik doporučení v této oblasti, která vám můžou pomoct zlepšit výkon vašich aplikací.

Další informace o prostředcích najdete v tématu Prostředky XAML.

Sdílení prostředků

Pokud vaše aplikace používá vlastní ovládací prvky a definuje prostředky v ResourceDictionary uzlu (nebo prostředky XAML), doporučuje se definovat prostředky na úrovni objektu Application nebo Window je definovat ve výchozím motivu pro vlastní ovládací prvky. Definování prostředků ve vlastním ovládacím prvku ResourceDictionary má dopad na výkon pro každou instanci tohoto ovládacího prvku. Pokud máte například operace štětce náročné na výkon definované jako součást definice prostředku vlastního ovládacího prvku a mnoho instancí vlastního ovládacího prvku, pracovní sada aplikace se výrazně zvýší.

Pro ilustraci tohoto bodu zvažte následující skutečnosti. Řekněme, že vyvíjíte karetní hru pomocí WPF. Pro většinu karetních her potřebujete 52 karet s 52 různými tvářemi. Rozhodnete se implementovat vlastní ovládací prvek karty a v prostředcích vlastního ovládacího prvku karty definujete 52 štětců (každý představuje tvář karty). V hlavní aplikaci jste původně vytvořili 52 instancí vlastního ovládacího prvku této karty. Každá instance vlastního ovládacího prvku karty generuje 52 instancí Brush objektů, což poskytuje celkem 52 × 52 Brush objektů ve vaší aplikaci. Přesunutím štětců z vlastního ovládacího prvku karty na Application úroveň objektu Window nebo jejich definováním ve výchozím motivu vlastního ovládacího prvku snížíte pracovní sadu aplikace, protože teď sdílíte 52 štětců mezi 52 instancemi ovládacího prvku karta.

Sdílení štětce bez kopírování

Pokud používáte stejný Brush objekt více prvků, definujte štětec jako prostředek a odkazujte na něj, a nedefinujte štětec vložený v xaml. Tato metoda vytvoří jednu instanci a znovu ji použije, zatímco definování štětců vložených v XAML vytvoří novou instanci pro každý prvek.

Následující ukázka značek ukazuje tento bod:

<StackPanel.Resources>
  <LinearGradientBrush x:Key="myBrush" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
    <LinearGradientBrush.GradientStops>
      <GradientStopCollection>
        <GradientStop Color="GoldenRod" Offset="0" />
        <GradientStop Color="White" Offset="1" />
      </GradientStopCollection>
    </LinearGradientBrush.GradientStops>
  </LinearGradientBrush>
</StackPanel.Resources>

<!-- Non-shared Brush object. -->
<Label>
  Label 1
  <Label.Background>
    <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
      <LinearGradientBrush.GradientStops>
        <GradientStopCollection>
          <GradientStop Color="GoldenRod" Offset="0" />
          <GradientStop Color="White" Offset="1" />
        </GradientStopCollection>
      </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
  </Label.Background>
</Label>

<!-- Shared Brush object. -->
<Label Background="{StaticResource myBrush}">Label 2</Label>
<Label Background="{StaticResource myBrush}">Label 3</Label>

Použití statických prostředků, pokud je to možné

Statický prostředek poskytuje hodnotu pro libovolný atribut vlastnosti XAML vyhledáním odkazu na již definovaný prostředek. Chování vyhledávání pro daný prostředek je podobné vyhledávání v čase kompilace.

Dynamický prostředek na druhé straně vytvoří dočasný výraz během počáteční kompilace, a proto odloží vyhledávání prostředků, dokud se požadovaná hodnota prostředku skutečně nevyžaduje k vytvoření objektu. Chování vyhledávání pro daný prostředek je podobné vyhledávání za běhu, což má dopad na výkon. Statické prostředky používejte, kdykoli je to možné v aplikaci, a to pomocí dynamických prostředků pouze v případě potřeby.

Následující ukázka značek ukazuje použití obou typů prostředků:

<StackPanel.Resources>
  <SolidColorBrush x:Key="myBrush" Color="Teal"/>
</StackPanel.Resources>

<!-- StaticResource reference -->
<Label Foreground="{StaticResource myBrush}">Label 1</Label>

<!-- DynamicResource reference -->
<Label Foreground="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">Label 2</Label>

Viz také