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。これにより、各エントリが一度インスタンス化され、すべてのコンシューマーで共有されます。リソースは遅延ロードされることに注意してください:

ResourceDictionaryの項目は、アプリケーションコードがXAMLローダーによってロードされたときにすぐには処理されません。代わりに、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 に答える