我有一个由C ++应用程序使用的WPF类库项目。
在我的项目中,我有许多用户控件,如下所示:
<UserControl x:Class="TheClass"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
[...]
>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MyLib;Themes/MyBigFatStyles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<StackPanel>
<views:CustomControl Style="{Static Resource CustomControlStyle}"/>
<views:CustomControl Style="{Static Resource CustomControlStyle}"/>
<views:CustomControl Style="{Static Resource CustomControlStyle}"/>
<views:CustomControl Style="{Static Resource CustomControlStyle}"/>
<views:CustomControl Style="{Static Resource CustomControlStyle}"/>
</StackPanel>
</UserControl>
每当显示此控件时,“MyBigFatStyles.xaml”将被加载到内存中五次。关闭容器不会释放内存,并显示控件再次将其加载到内存中五次。另一个控件将“MyBigFatStyles.xaml”加载到内存中超过150次,并迅速导致OutOfMemory异常。
我的解决方法,我通过搜索解决方案找到的,一直是创建一个名为“SharedResourceDictionary”的静态类来使用它而不是ResourceDictionary,这大大减少了内存占用,使其变得易于管理。但这会破坏视觉设计师,并且还需要更改每个项目中的每个XAML文件。
有更好的方法吗?其他答案已经说过将重复使用的词典放在App.xaml中,但我知道这只是WPF应用程序的一个选项,这里的WPF是在一个从C ++(而不是CLI)应用程序调用的类库中。