2012-12-20 2 views
9

Ich mag diesesHat jeder Verweis auf eine Resource eine neue Instanz erstellen oder zu tun haben ResourceDictionaries einen Caching-Mechanismus

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

einen Code haben, die mehrmals in meiner Anwendung erscheint (manchmal als C# und manchmal als Äquivalent XAML). Enthält jede Instanz separate Instanzen ihrer Ressourcen oder gibt es einen Caching-Mechanismus im Hintergrund, der diese Ressourcen über alle Ressourcenwörterbücher verteilt?

Ich versuche zu entscheiden, ob ich die Ressourcenwörterbücher effizient nutzen muss (dh bestimmte Instanzen teilen) oder ob diese Optimierung bereits von WPF behandelt wird.

Antwort

5

Wenn ich Ihre Frage zu verstehen, dann ist die Antwort, sie sind nicht „Cache“ * zwischen verschiedenen ResourceDictionary Instanzen: eine Instanz von Resource wird jede Ressource nicht verwendet vom gleichen Typ/Schlüssel, der auch gewesen sein mag instanziiert bereits in einem anderen ResourceDictionary. Dies steht natürlich im Gegensatz zu den Schlüsseln innerhalb eines einzigen ResourceDictionary; Jeder dieser Einträge wird tatsächlich "zwischengespeichert", in dem Sinne, dass sie einmal erstellt und gemeinsam genutzt werden (mit Ausnahme für Ressourcen vom Typ Wert, die bei jeder Verwendung kopiert werden).

Sie müssen also den Umfang Ihrer Ressourcen verwalten, wenn sie speicherintensiv sind. Sie können jede Ressource in Ihr Hauptverzeichnis einfügen, das sicherstellt, dass jeder Eintrag einmal instanziiert und für alle seine Benutzer freigegeben wird. Hinweis: the resources are lazy-loaded:

Die Elemente in einem ResourceDictionary werden nicht sofort verarbeitet, wenn Anwendungscode von einem XAML-Loader geladen wird. Stattdessen bleibt das ResourceDictionary als Objekt bestehen, und die einzelnen Werte werden nur verarbeitet, wenn sie speziell angefordert werden.

So haben Sie nicht über Ihre Anwendung Laden alle die Ressourcen in App.xaml beim Start besorgt sein; Es lädt sie nur nach Bedarf.

+0

verstehe ich das richtig, dass im Fall 'App .Xaml' hat die Ressource 'Foo.Xaml' und verwendet auch' MyButton.Xaml' als UI-Element - was wiederum auf die Ressource 'Foo.Xaml' als' MergedDictionary' verweist, 'Foo.xaml' wird nur einmal geladen? Oder wird es zwei Instanzen geben? – BatteryBackupUnit

0

einen Wörterbuch haben, das für jede Nutzung nicht

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

u mit der x spielen Für die Ressourcen selbst instanziert wird: gemeinsames Attribut

Verwandte Themen