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
Allgemeine Vorgehensweise? Haben Sie eine Verbindung zu einer breiteren Diskussion über diese Technik? –
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/ –
http://www.wpftutorial.net/MergedDictionaryPerformance.html –