2012-11-22 6 views
5

BEARBEITEN: Dieses Problem tritt bei Verwendung des Standard .NET ResourceDictionary ebenfalls auf und scheint ein Problem bei der Verwendung von Ressourcenwörterbüchern in Steuerelement- oder Datenvorlagen zu sein.Benutzerdefiniertes Ressourcenwörterbuch in ControlTemplate oder DataTemplate

Ich habe ein benutzerdefiniertes Ressourcenwörterbuch, das einem gemeinsamen Ansatz für die Freigabe von Ressourceninstanzen folgt.

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

Es funktioniert gut, aber wenn es in einem Ressourcen-Element innerhalb eines Control oder Datatemplate verwiesen wird, gibt es störende Fehler angezeigt (diese nicht die Build beeinflussen, die noch gelingt) .

Dieser wird für die Standard-Resource gezeigt, die SharedResourceDictionary in ihrer fusionierten Wörterbücher enthält:

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

Beispiel 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> 

Hat Ideen jemand wie ich dieses Ärgernis Fehler beseitigen kann?

Vielen Dank

+0

Allgemeine Vorgehensweise? Haben Sie eine Verbindung zu einer breiteren Diskussion über diese Technik? –

+0

Hier ist eins ... es gibt mehr, die ich später ausgraben werde, wenn ich Zeit habe. http://softnotes.wordpress.com/2011/04/05/shared-resourcedictionary-for-silverlight/ –

+0

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

Antwort

Verwandte Themen