最佳化效能:應用程式資源

WPF 可讓您共用應用程式資源,以便跨類似類型的專案支援一致的外觀或行為。 本主題提供此領域的一些建議,可協助您改善應用程式的效能。

如需詳細資訊,請參閱 XAML 資源

共用資源

如果您的應用程式使用自訂控制項並在 (或 XAML 資源] 節點中 ResourceDictionary 定義資源,建議您在 或 Window 物件層級定義資源 Application ,或在自訂控制項的預設主題中定義資源。 定義自訂控制項 ResourceDictionary 中的資源會對該控制項的每個實例造成效能影響。 例如,如果您的效能密集型筆刷作業定義為自訂控制項的資源定義和自訂控制項的許多實例的一部分,應用程式的工作集將會大幅增加。

若要說明這一點,請考慮下列事項。 假設您正在開發使用 WPF 的卡片遊戲。 對於大部分的卡片遊戲,您需要 52 張不同臉部的 52 張卡片。 您決定實作卡片自訂控制項,並在卡片自訂控制項的資源中定義 52 個筆刷(每個筆刷都代表卡片臉部)。 在主要應用程式中,您一開始會建立此卡片自訂控制項的 52 個實例。 卡片自訂控制項的每個實例都會產生 52 個 Brush 物件的實例,這可讓您在應用程式中總共 52 * 52 Brush 個物件。 藉由將筆刷從卡片自訂控制項資源 Application 移至 或 Window 物件層級,或在自訂控制項的預設主題中定義筆刷,即可減少應用程式的工作集,因為您現在在卡片控制項的 52 個實例之間共用 52 個筆刷。

共用筆刷而不復制

如果您有多個 Brush 元素使用相同的物件,請將筆刷定義為資源並加以參考,而不是在 XAML 中內嵌定義筆刷。 此方法會建立一個實例並重複使用它,而定義 XAML 中的筆刷會為每個元素建立新的實例。

下列標記範例說明這一點:

<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>

可能的話,請使用靜態資源

靜態資源藉由查閱已定義資源的參考,為任何 XAML 屬性提供值。 該資源的查閱行為類似于編譯時期查閱。

另一方面,動態資源會在初始編譯期間建立暫存運算式,因此延遲查閱資源,直到實際需要要求的資源值才能建構物件。 該資源的查閱行為類似于執行時間查閱,這會影響效能。 請盡可能在應用程式中使用靜態資源,並在必要時才使用動態資源。

下列標記範例顯示這兩種類型的資源使用:

<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>

另請參閱