如何在项目的各个部分有效地使用资源字典

时间:2016-11-14 12:39:25

标签: c# wpf optimization static resourcedictionary

我在许多转换器中使用资源字典(相同的字典)作为局部变量。

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关键字有什么问题?

2 个答案:

答案 0 :(得分:3)

这是WPF ResourceDictionaries的一个众所周知的问题。解决方案是自己实现SharedResourceDictionary构造,这可以防止在每次使用时重新实例化资源。请看一下这个链接:WPF SharedResourceDictionary,以获得SharedResourceDictionary构造的一个很棒的实现。(作者的所有作品)

答案 1 :(得分:1)

您需要解决两个问题:

  1. 资源词典可以在项目或解决方案的各个模块之间共享;
  2. 使用设计时资源字典来协助样式设置会很方便。
  3. 要解决问题#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,如下所示:

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