我在许多转换器中使用资源字典(相同的字典)作为局部变量。
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关键字有什么问题?
答案 0 :(得分:3)
这是WPF ResourceDictionaries的一个众所周知的问题。解决方案是自己实现SharedResourceDictionary构造,这可以防止在每次使用时重新实例化资源。请看一下这个链接:WPF SharedResourceDictionary,以获得SharedResourceDictionary构造的一个很棒的实现。(作者的所有作品)
答案 1 :(得分:1)
您需要解决两个问题:
要解决问题#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>