Share via


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

更新:2007 年 11 月

WPF 可讓您共用應用程式資源,因此可以支援類似型別項目的一致外觀或行為。本主題提供這個區域的一些建議,以協助您改善應用程式的效能。

如需資源的詳細資訊,請參閱資源概觀

共用資源

如果應用程式使用自訂控制項,並在 ResourceDictionary (或「XAML 資源」節點) 中定義資源,則建議您在 ApplicationWindow 物件層級定義資源,或將它們定義於自訂控制項的預設佈景主題中。而在自訂控制項的 ResourceDictionary 中定義資源,會影響該控制項之每個執行個體的效能。例如,如果您將損耗效能的筆刷作業定義為自訂控制項的資源定義一部分,而且擁有自訂控制項的多個執行個體,則應用程式的工作集會明顯增加。

為了說明這一點,請考慮下列事項。假設您使用 WPF 開發撲克牌遊戲。在大部分的撲克牌遊戲中,都需要有 52 張撲克牌,具有 52 種不同卡面。而您決定實作撲克牌自訂控制項,並且在撲克牌自訂控制項的資源中定義 52 種筆刷 (每個都代表一種卡面)。在主要應用程式中,一開始會為這個撲克牌自訂控制項建立 52 個執行個體。撲克牌自訂控制項的每個執行個體都會產生 52 個 Brush 物件的執行個體,因此在應用程式中總共會提供 52 * 52 個 Brush 物件。若將筆刷移出撲克牌自訂控制項資源並放至 ApplicationWindow 物件層級,或將它們定義於自訂控制項的預設佈景主題中,則可減少應用程式的工作集,因為現在是在 52 個撲克牌控制項執行個體之間共用 52 個筆刷。

在未複製的情況下共用筆刷

如果有多個使用相同 Brush 物件的項目,請將筆刷定義為資源並進行參考,而不是以 XAML 定義筆刷內嵌 (Inline)。這種方法會建立一個執行個體,並重新使用該執行個體,而在 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>

請參閱

概念

最佳化 WPF 應用程式效能

應用程式效能規劃

最佳化效能:運用硬體

最佳化效能:配置與設計

最佳化效能:2D 圖形和影像處理

最佳化效能:物件行為

最佳化效能:文字

最佳化效能:資料繫結

最佳化效能:其他建議

WPF 效能工具和資源