2012-11-22 15 views
5

MODIFICA: questo problema si verifica quando si utilizza anche lo standard .NET ResourceDictionary e sembra essere un problema con l'utilizzo di dizionari di risorse all'interno di modelli di dati o di controllo.Dizionario risorse personalizzate in ControlTemplate o DataTemplate

Ho un dizionario di risorse personalizzate che segue un approccio comune alla condivisione delle istanze di risorsa.

http://softnotes.wordpress.com/2011/04/05/shared-resourcedictionary-for-silverlight/ http://www.wpftutorial.net/MergedDictionaryPerformance.html

public class SharedResourceDictionary : ResourceDictionary 
{ 
    static readonly Dictionary<Uri, WeakReference<ResourceDictionary>> SharedDictionaries = new Dictionary<Uri, WeakReference<ResourceDictionary>>(); 

    Uri _sourceUri; 

    public new Uri Source 
    { 
     get 
     { 
      // Behave like standard resource dictionary for IDE... 
      if (VisualStudio.IsInDesignMode) 
       return base.Source; 

      return this._sourceUri; 
     } 
     set 
     { 
      // Behave like standard resource dictionary for IDE... 
      if (VisualStudio.IsInDesignMode) 
      { 
       base.Source = value; 
       return; 
      } 

      this._sourceUri = value; 

      WeakReference<ResourceDictionary> cached; 
      if (SharedDictionaries.TryGetValue(value, out cached)) 
      { 
       ResourceDictionary rd; 
       if (cached.TryGetTarget(out rd)) 
       { 
        this.MergedDictionaries.Add(rd); 
        return; 
       } 
      } 

      base.Source = value; 
      SharedDictionaries[value] = new WeakReference<ResourceDictionary>(this); 
     } 
    } 
} 

Funziona bene, ma ogni volta che viene fatto riferimento all'interno di un elemento di risorse all'interno di un ControlTemplate o DataTemplate, ci sono errori spuri riportati (non pregiudichino la build, che riesce ancora) .

Questo viene mostrato per la ResourceDictionary standard che contiene SharedResourceDictionary nei suoi dizionari uniti:

Unable to cast object of type 'Microsoft.Expression.Markup.DocumentModel.DocumentCompositeNode' to type 'System.Windows.ResourceDictionary' 

Esempio XAML:

<DataTemplate DataType="{x:Type vm:MyViewModel}"> 
    <DockPanel Style="{DynamicResource MainDockPanel}"> 
     <DockPanel.Resources> 
      <ResourceDictionary> 
       <ResourceDictionary.MergedDictionaries> 
        <p:SharedResourceDictionary Source="/MyAssembly;component/MyResources.xaml" /> 
       </ResourceDictionary.MergedDictionaries> 
      </ResourceDictionary> 
     </DockPanel.Resources> 
    </DockPanel> 
</DataTemplate> 

Qualcuno ha qualche idea come posso eliminare questo errore fastidio?

Grazie

+0

Approccio comune? Hai qualche link per una discussione più ampia su questa tecnica? –

+0

Eccone uno ... ce ne sono altri che scaverò più tardi quando avrò tempo. http://softnotes.wordpress.com/2011/04/05/shared-resourcedictionary-for-silverlight/ –

+0

http://www.wpftutorial.net/MergedDictionaryPerformance.html –

risposta

Problemi correlati