2012-07-03 14 views
9

Aby zoptymalizować moją aplikację, tworzę obiekt SharedResourceDictionary. Dzięki temu oszczędzam około 250 MB pamięci podczas działania, więc działa dobrze.SharedResourceDictionary: edytuj zasób w mieszance

Mój problem dotyczy czasu projektowania, w Blend 4, nie mam już dostępu do mojego zasobu. Aby zmodyfikować szablon (wiedźma jest w moim pliku zasobów), zwykle prawym przyciskiem myszy na moją kontrolą i wybrać Edycja szablonu -> Edit prąd, jak na tym zdjęciu:

enter image description here

muszę zmodyfikować moje szablon drogę, to 100x szybciej niż iść w moim pliku zasobów i znaleźć dobry ... mam dużo zasobów ...

Moja SharedResourceDictionary jest realizowany tak (znalezione w internecie):

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 
     { 
      if (IsInDesignMode) 
       return base.Source; 

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

    /// <summary> 
    /// Check if we are in Blend to prevent error 
    /// </summary> 
    public bool IsInDesignMode 
    { 
     get 
     { 
      return 
      (bool) 
      DependencyPropertyDescriptor.FromProperty(DesignerProperties.IsInDesignModeProperty, 
      typeof(DependencyObject)).Metadata.DefaultValue; 
     } 
    } 
} 

Ktoś ma pomysł, jeśli t tutaj jest rozwiązanie tego? Naprawdę chcę zachować ten wspólny słownik ze względu na poprawę pamięci, ale chcę też łatwo zmodyfikować moje zasoby ...

Każda wskazówka zostanie doceniona. Dziękuję Ci.

EDIT:

Robi to (SharedResourceDictionary), ja też mam problem z zasobem statycznej:

Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception. 

I kiedy je zmienić na dynamiczny zasób to działa, czy mogę zmienić SharedResourceDictionary przez prosty ResourceDictionary również działa. Projekt może się kompilować, ale nie mogę edytować zasobu bez modyfikacji, jak już powiedziałem.

+0

myślę, że byłoby dobrze, aby odwoływać się także źródła próbki kodu: http: //www.wpftutorial.net/MergedDictionaryPerformance.html, ta sama sekcja komentarza źródłowego wyjaśnia, w jaki sposób korzystać ze współdzielonych słowników zasobów w czasie projektowania. Dzięki. – Ahmad

+0

Możliwym sposobem na uniknięcie tego jest zastąpienie SharedResourceDictionary z prostym ResourceDictionary w trybie debugowania, tj .: #if DEBUG public class SharedResourceDictionary: ResourceDictionary { } #else ... Cesario

Odpowiedz

1

Czy kompilacji dla .NET 4?

można się uderzając błąd gdy nie aby poprawnie skanować twoje ResourceDictionaries.

Mówimy, że musisz dodać swoje ResourceDictionaries na poziomie App.xaml (na poziomie Application.Resources) i dodać fikcyjny styl domyślny.

To może nie działać, ponieważ wydajesz się, że dodajesz swoje zasoby do kontroli.

http://blogs.windowsclient.net/rob_relyea/archive/2010/04/26/my-staticresource-reference-worked-differently-with-wpf-4-rc-than-it-does-with-wpf-4-rtm.aspx

Adding a Merged Dictionary to a Merged Dictionary

Trouble referencing a Resource Dictionary that contains a Merged Dictionary

http://connect.microsoft.com/VisualStudio/feedback/details/553528/defaultstylekey-style-not-found-in-inner-mergeddictionaries

+0

Wydaje się, że to nie rozwiązuje problemu. Nadal napotykam problem przy użyciu [tej implementacji SharedResourceDictionary] (http://stackoverflow.com/a/10722527/1781068). – Gregor

0

W rzeczywistości korzystanie z tej funkcji jest problematyczne. = (

Może w przyszłości będzie lepiej, nie wiem, czy pomoże, ale można spróbować innego realizacji: WPF SharedResourceDictionary (ale nie gwarantuje to będzie działać)

dałem się używając SharedResourceDictionary powodu problemów w czasie projektowania, tylko gdy projekt jest w 100% ukończony będę z powrotem w użyciu.