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

标签 wpf xaml optimization resourcedictionary

我有一些这样的代码

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

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

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

最佳答案

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

因此,如果资源是内存密集型的,则您必须管理资源的范围。您始终可以将每个资源放入主 App.xaml字典,确保每个条目将被实例化一次,并为其所有消费者共享。请注意 the resources are lazy-loaded :

The items in a ResourceDictionary are not immediately processed when application code is loaded by a XAML loader. Instead, the ResourceDictionary persists as an object, and the individual values are processed only when they are specifically requested.



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

关于wpf - 每个对 ResourceDictionary 的引用是否创建一个新实例,或者 ResourceDictionaries 是否有缓存机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13965694/

相关文章:

performance - 我可以做些什么来提高 Lua 程序的性能?

c# - Silverlight:来自一个用户控件的事件能否在不同的用户控件和/或包含控件上开始动画

c# - WPF 中缺少 ListView.Columns

c# - 如何在网格中移动项目

wpf - 如何根据所需的客户区大小设置 WPF 窗口的大小?

WPF:Xaml,在.NET 4.0中的xaml中创建一个可观察的集合<object>

c++ - isdigit() 总是通过检查

Wpf 应用程序崩溃 - 错误模块名称 coreclr.dll 版本 : 4. 700.20.47201

c# - 当基类是泛型时在 XAML 中设置依赖属性

python为scipy中的约束动态创建字典