2012-07-03 15 views
9

Per ottimizzare la mia applicazione, creo un SharedResourceDictionary. Con questo, risparmio circa 250 mb di memoria in fase di esecuzione, quindi funziona bene.SharedResourceDictionary: modifica risorsa in Miscela

Il mio problema è in fase di progettazione, in Blend 4, non ho più accesso alla mia risorsa. Per modificare un modello (strega è nel mio file di risorse), di solito fate clic destro su mio controllo e scelgo Modifica modello -> Modifica in corso, come in questa immagine:

enter image description here

ho bisogno di modificare il mio template in questo modo, è 100 volte più veloce quindi di andare nel mio file di risorse e trovare quello buono ... ho un sacco di risorse ...

mio SharedResourceDictionary è implementato come questo (che si trova sul web):

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

Qualcuno ha un'idea se t ecco una soluzione per questo? Voglio davvero mantenere questo dizionario condiviso a causa del miglioramento della memoria, ma voglio anche modificare facilmente la mia risorsa ...

Qualsiasi indizio sarà apprezzato. Grazie.

EDIT:

In questo modo (SharedResourceDictionary), ho anche un problema con risorsa statica:

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

E quando li cambio di dinamica delle risorse funziona, o se cambio lo SharedResourceDictionary da un semplice ResourceDictionary funziona anche. Il progetto può essere compilato ma non posso modificare la risorsa senza una modifica come ho detto.

+0

Penso che sarebbe anche un bene per fare riferimento alla fonte del codice di esempio: http: //www.wpftutorial.net/MergedDictionaryPerformance.html, anche la stessa sezione del commento sorgente spiega come utilizzare i dizionari delle risorse condivise in fase di progettazione. Grazie. – Ahmad

+0

Un modo possibile per evitare questo è quello di sostituire lo SharedResourceDictionary con una semplice ResourceDictionary quando è in modalità di debug, vale a dire .: #if DEBUG public class SharedResourceDictionary: ResourceDictionary {} #else ... Cesario

risposta

1

Sei alla compilazione for .NET 4?

si potrebbe colpire il bug in cui viene a mancare per scansionare correttamente i tuoi ResourceDictionaries:

Si parla di aggiungere i propri ResourceDictionaries al livello App.xaml (in Application.Resources) e aggiungere uno stile fittizio predefinito.

Questo potrebbe non funzionare per te poiché sembra che tu stia aggiungendo le tue risorse sotto il tuo controllo.

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

Questo non sembra risolvere il problema. Ho ancora riscontrato il problema utilizzando [questa implementazione SharedResourceDictionary] (http://stackoverflow.com/a/10722527/1781068). – Gregor

0

In realtà è problematico utilizzare questa funzione. = (

Forse in futuro le cose andranno meglio, non so se vi aiuterà, ma si può provare una diversa implementazione: WPF SharedResourceDictionary (ma non garantisce che funzionerà)

ho rinunciato usando la SharedResourceDictionary a causa di problemi in fase di progettazione, solo quando il progetto è completato al 100% Torno da usare.

Problemi correlati