Sdílet prostřednictvím


Optimalizace výkonu: Prostředky 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 (nebo v uzlu Prostředky XAML), doporučuje se definovat prostředky na úrovni Application nebo Window objektu nebo je definovat ve výchozím motivu pro vlastní ovládací prvky. Definování prostředků v ResourceDictionary vlastního ovládacího prvku má dopad na výkon pro každou instanci tohoto ovládacího prvku. Pokud máte například výkonově náročné operace štětce definované v rámci specifikace zdrojů vlastního ovládacího prvku a máte mnoho instancí tohoto vlastního ovládacího prvku, pracovní paměť 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 pro kartu na objektovou úroveň Application nebo 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 pro kartu.

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

Pokud máte více prvků používajících stejný objekt Brush, definujte štětec jako prostředek a odkazujte na něj, spíše než abyste jej definovali přímo v XAML. Tato metoda vytvoří jednu instanci a znovu ji použije, zatímco definování štětců přímo 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 tento zdroj je podobné vyhledávání za běhu, což může mít 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 kódu 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é