10

我有一些这样的代码

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

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

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

4

2 回答 2

5

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

因此,如果它们是内存密集型的,您必须管理资源的范围。您始终可以将每个资源放入主App.xaml字典中,这样可以确保每个条目都会被实例化一次,并为其所有使用者共享。请注意,资源是延迟加载的

当 XAML 加载程序加载应用程序代码时,不会立即处理 ResourceDictionary 中的项目。相反,ResourceDictionary 作为一个对象持续存在,并且只有在特别请求它们时才会处理各个值。

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

于 2012-12-20T05:40:22.087 回答
1

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

/// <summary>
    /// The shared resource dictionary is a specialized resource dictionary
    /// that loads it content only once. If a second instance with the same source
    /// is created, it only merges the resources from the cache.
    /// </summary>
    public class SharedResourceDictionary : ResourceDictionary
    {
        /// <summary>
        /// Internal cache of loaded dictionaries 
        /// </summary>
        public static Dictionary<Uri, ResourceDictionary> _sharedDictionaries =
            new Dictionary<Uri, ResourceDictionary>();

        /// <summary>
        /// Local member of the source uri
        /// </summary>
        private Uri _sourceUri;

        /// <summary>
        /// Gets or sets the uniform resource identifier (URI) to load resources from.
        /// </summary>
        public new Uri Source
        {
            get { return _sourceUri; }
            set
            {
                _sourceUri = value;

                if (!_sharedDictionaries.ContainsKey(value))
                {
                    // If the dictionary is not yet loaded, load it by setting
                    // the source of the base class
                    base.Source = value;

                    // add it to the cache
                    _sharedDictionaries.Add(value, this);
                }
                else
                {
                    // If the dictionary is already loaded, get it from the cache
                    MergedDictionaries.Add(_sharedDictionaries[value]);
                }
            }
        }
    }

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

于 2016-04-19T12:21:53.797 回答