WPF:如何在不使用app.xaml的情况下确保我的样式只加载一次?

时间:2017-07-21 17:01:17

标签: c++ wpf xaml

我有一个由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)应用程序调用的类库中。

0 个答案:

没有答案