2016-11-14 20 views
5

我在許多轉換器中使用資源字典(同一字典)作爲局部變量。如何在項目的所有部分高效使用資源字典

var DeignerDictionary = new ResourceDictionary 
{ 
    Source = new Uri(path) 
}; 

每次我創建一個新的實例,內存在應用程序中變得非常高。

然後我已經將資源字典移動到靜態字段中,並且正在重用字典,但樣式不能正確呈現。

public class resourceDictionaryProvider{ 
    public readonly ResourceDictionary StaticDictionary = 
    new ResourceDictionar {Source = new Uri(path)}; 
} 

任何人都可以建議我做錯了什麼,請提供您的建議。

將ResourceDictionary更改爲僅靜態後發生此問題。但以下代碼正常工作。

public class resourceDictionaryProvider{ 
    public static readonly ResourceDictionary StaticDictionary = 
    new ResourceDictionar {Source = new Uri(path)}; 
} 

現在我對resourceDictionaryProvider類創建一個實例,並能正常工作,但我不希望創建實例,因此只有我已經把它改爲靜態的。

這裏static關鍵字有什麼問題?

+6

代碼隱藏你不應該實例ResourceDictionaries。它們應該在XAML文件中聲明,並且(如有必要)可以從後面的代碼中訪問。 – Clemens

+1

您可以在http://stackoverflow.com/questions/25023671/nested-resource-dictionary-in-separate-library中使用Source屬性將資源字典嵌套在其他資源字典中作爲explainen。 App.xaml包含將隨應用程序自動加載的資源字典,因此,您包含或引用的資源可用於應用程序範圍。 –

+1

他試圖解決的問題是資源字典實例的一個衆所周知的問題(主要資源豬,因爲它會在每次通過控件引用時重新創建包括所有嵌套字典的字典) - 他試圖本質上使用SharedResourceDictionary。這個問題是有效的,很高興看到這個實際的答案。 – Maverik

回答

3

這是WPF ResourceDictionaries的一個衆所周知的問題。解決方案是自己實現一個SharedResourceDictionary構造,這可以防止在每次使用時重新實例化資源。看看這個鏈接:WPF SharedResourceDictionary一個真棒實施SharedResourceDictionary結構的(所有學分的作者)

+1

多一個實現與位解釋:http://www.wpftutorial.net/MergedDictionaryPerformance.html – Allender

1

這裏有兩個問題需要解決:

  1. 資源字典可以在共享您的項目或解決方案的模塊;
  2. 有設計時間資源字典來協助樣式設置會很方便。

爲了解決這個問題#1,它可以輕鬆地將資源字典添加到App.xaml文件,然後他們將被實例化一次,並且將提供給整個項目,像這樣:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary 
       Source="pack://application:,,,/Themes;component/Generic.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

爲了解決這個問題,#2,您需要的資源字典只在設計時實例化的解決方法解決方案。退房Design time resource dictionary

,然後,你可以使用DesignTimeResourceDictionary你的用戶界面,像這樣:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <designer:DesignTimeResourceDictionary 
       Source="pack://application:,,,/Themes;component/Generic.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources>