2016-11-14 4 views
5

多くのコンバータでリソースディクショナリ(同じ辞書)をローカル変数として使用しています。プロジェクトのすべての部分でリソースディクショナリを効率的に使用する方法

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

私が新しいインスタンスを作成するたびに、メモリはアプリケーションで非常に高くなります。

次に、リソース辞書を静的フィールドに移動して辞書を再利用していますが、スタイルは正しく表示されません。

誰でも私が間違っていることを示唆することはできません、あなたの提案を提供してください。

この問題は、静的なものとしてResourceDictionaryを変更した後に発生します。ただし、次のコードは正常に動作します。

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

は、今私はresourceDictionaryProviderクラスのインスタンスを作成していますし、それが正常に動作し、しかし、私は、私は、静的にそれを変更しただけなのでインスタンスを作成する必要はありません。

staticキーワードにはどのような問題がありますか?

+6

。 XAMLファイルで宣言し、必要に応じてコードの背後からアクセスする必要があります。 – Clemens

+1

http://stackoverflow.com/questions/25023671/nested-resource-dictionary-in-separate-libraryの説明でSource属性を使用して、他のリソースディクショナリ内のリソース辞書をネストすることができます。 App.xamlにはアプリケーションと自動的にロードされるリソースディクショナリが含まれているので、そこにインクルードまたは参照するものは、アプリケーションワイドを使用するために利用できます。 –

+1

彼が取り組もうとしている問題は、リソースディクショナリインスタンス(コントロールを介して参照されるたびにすべてのネストされたものを含む辞書を再作成するため、主要なリソース豚)のよく知られた問題である - 彼はSharedResourceDictionaryを基本的に使用しようとしている。質問は有効で、これに対する実際の答えを見てうれしいです。 – Maverik

答えて

3

これは、WPF ResourceDictionariesのよく知られた問題です。解決方法は、あなた自身でSharedResourceDictionaryコンストラクトを実装して、各使用時にリソースの再インスタンス化を防ぐことです。 SharedResourceDictionary構築物の素晴らしい実装にWPF SharedResourceDictionary二つの問題は、あなたが対処する必要があります

+1

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

をチェックアウトしてから、あなたはこのように、あなたのUIにDesignTimeResourceDictionaryを使用することができます:あなたはコードビハインドでResourceDictionariesをインスタンス化してはならない

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <designer:DesignTimeResourceDictionary 
       Source="pack://application:,,,/Themes;component/Generic.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 
関連する問題