每个对ResourceDictionary的引用是否都创建了一个新实例,或者ResourceDictionaries是否具有缓存机制

时间:2012-12-20 05:10:29

标签: wpf xaml optimization resourcedictionary

我有一些像这样的代码

        _images = new ResourceDictionary
        {
            Source = new Uri(@"pack://application:,,,/Trilogy.T1TY2012.Transmission;component/Resources/Images.xaml")
        };

在我的应用程序中出现过几次(有时作为C#,有时作为等效的XAML)。每个实例是否包含其每个资源的单独实例,或者是否存在在所有资源字典中共享这些资源的幕后缓存机制?

我正在尝试决定是否需要高效使用资源字典(即:共享特定实例),或者WPF是否已经处理了此优化。

2 个答案:

答案 0 :(得分:5)

如果我理解你的问题,那么答案是,它们不会在不同的ResourceDictionary实例之间“缓存”:ResourceDictionary的一个实例将使用任何资源可能已在另一个ResourceDictionary中实例化的相同类型/密钥。当然,这与单个ResourceDictionary中的键 形成对比;这些条目中的每一个都确实是“缓存的”,因为它们是一次创建并共享的(对于每次使用时都复制的值类型资源除外)。

因此,如果资源占用大量内存,则必须管理资源范围。您始终可以将每个资源放入主App.xaml字典中,这样可确保每个条目都实例化一次,并为其所有使用者共享。请注意the resources are lazy-loaded

  

当XAML加载程序加载应用程序代码时,不会立即处理ResourceDictionary中的项目。相反,ResourceDictionary作为对象保留,并且仅在特别请求时才处理各个值。

因此,您不必担心应用程序在启动时加载所有 App.xaml中的资源;它只在需要时加载它们。

答案 1 :(得分:1)

拥有一个不会为每次使用实例化的字典

{{1}}

对于资源本身,您可以使用x:shared属性