2012-12-20 10 views
9

ho qualche codice come questoVuol ogni riferimento ad un ResourceDictionary creare una nuova istanza, o Do ResourceDictionaries hanno un meccanismo di caching

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

che compare più volte nella mia applicazione (a volte come C# e, a volte come l'equivalente XAML). Ogni istanza contiene istanze separate di ciascuna delle sue risorse oppure esiste un meccanismo di memorizzazione nella cache dietro le quinte che condivide tali risorse tra tutti i dizionari delle risorse?

Sto cercando di decidere se è necessario fare un uso efficiente dei dizionari delle risorse (ad esempio: condividere istanze specifiche) o se questa ottimizzazione è già gestita da WPF.

risposta

5

Se io sto capendo la tua domanda, allora la risposta è, non sono "cache" * tra le diverse istanze ResourceDictionary: un'istanza di ResourceDictionary sarà non utilizzare alcuna risorsa dello stesso tipo/chiave che potrebbe essere stato istanziato già in un altro ResourceDictionary. Ciò va contrapposto, ovviamente, ai tasti all'interno di un singolo ResourceDictionary; ognuna di queste voci è effettivamente "memorizzata nella cache", nel senso che vengono create una volta e condivise (con un'eccezione per le risorse tipizzate dal valore, che vengono copiate su ciascun utilizzo).

Quindi, è necessario gestire l'ambito delle risorse se sono ad uso intensivo di memoria. È sempre possibile inserire ciascuna risorsa nel dizionario principale App.xaml, che garantisce che ciascuna voce venga creata un'istanza una sola volta e condivisa per tutti i suoi utenti. Si noti che the resources are lazy-loaded:

gli articoli in una ResourceDictionary non vengono immediatamente trasformati quando il codice di applicazione viene caricato da un caricatore XAML. Invece, ResourceDictionary persiste come oggetto e i singoli valori vengono elaborati solo quando sono specificatamente richiesti.

Quindi non c'è bisogno di essere preoccupati per la vostra applicazione di carico tutte le risorse in App.xaml all'avvio; li carica solo se necessario.

+0

faccio capito bene, che in caso 'App .Xaml' ha una risorsa 'Foo.Xaml', e usa anche' MyButton.Xaml' come elemento UI - che a sua volta fa riferimento anche alla risorsa 'Foo.Xaml' come' MergedDictionary', 'Foo.xaml' viene caricato una sola volta? O ci saranno due istanze? – BatteryBackupUnit

0

Per avere un dizionario che non verrà creata un'istanza per ogni utilizzo

/// <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]); 
       } 
      } 
     } 
    } 

Per gli si risorse u può giocare con la x: attributo condiviso

Problemi correlati