2012-12-20 9 views
9

Mam niektóre kod jak tenCzy każde odniesienie do ResourceDictionary utworzyć nową instancję, czy ResourceDictionaries posiadają mechanizm buforowania

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

który pojawia się kilka razy w mojej aplikacji (czasami jak C#, a czasami jako ekwiwalent XAML). Czy każda instancja zawiera osobne instancje każdego z jej zasobów, czy też istnieje mechanizm buforowania ukryty, który udostępnia te zasoby we wszystkich słownikach zasobów?

Próbuję zdecydować, czy muszę efektywnie korzystać ze słowników zasobów (np. Udostępniać określone instancje), czy też optymalizacja jest już obsługiwana przez WPF.

Odpowiedz

5

Jeśli mam zrozumieć Twoje pytanie, to odpowiedź brzmi, że nie są „buforowane” * pomiędzy różnymi ResourceDictionary przypadkach: instancją ResourceDictionary będzie nie korzystania z zasobów tego samego typu/Key, które mogły zostać utworzony już w innym ResourceDictionary. Należy to skontrastować, oczywiście, z kluczami w jednym pliku ResourceDictionary; każdy z tych wpisów jest rzeczywiście "buforowany" w tym sensie, że są one tworzone raz i współdzielone (z wyjątkiem dla zasobów o typach wartości, które są kopiowane przy każdym użyciu).

Musisz więc zarządzać zakresem swoich zasobów, jeśli wymagają one dużej ilości pamięci. Zawsze możesz umieścić każdy zasób w głównym słowniku App.xaml, który zapewnia, że ​​każdy wpis zostanie raz utworzony i udostępniony wszystkim jego klientom. Zauważ, że the resources are lazy-loaded:

Pozycje w ResourceDictionary nie są przetwarzane natychmiast po załadowaniu kodu aplikacji przez program ładujący XAML. Zamiast tego ResourceDictionary działa jako obiekt, a poszczególne wartości są przetwarzane tylko wtedy, gdy są wymagane.

Więc nie musi być zaniepokojony Twojej aplikacji wszystkich zasoby w App.xaml na starcie; ładuje je tylko w razie potrzeby.

+0

mogę zrozumieć to słusznie, że w przypadku 'aplikacji .Xaml' ma zasób 'Foo.Xaml', a także używa' MyButton.Xaml' jako elementu interfejsu użytkownika - który z kolei również odwołuje się do zasobu 'Foo.Xaml' jako' MergedDictionary', 'Foo.xaml' jest ładowany tylko raz? A może będą dwa przypadki? – BatteryBackupUnit

0

ma słownik, który nie zostanie natychmiast utworzony dla każdego użycia

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

Dla zasobów sama u może grać z X: wspólny atrybut

Powiązane problemy