2012-11-22 6 views
5

EDYCJA: Ten problem występuje również w przypadku korzystania ze standardowego pliku .NET ResourceDictionary i wydaje się, że jest to problem związany ze stosowaniem słowników zasobów w szablonach kontrolnych lub danych.Niestandardowy słownik zasobów w programie ControlTemplate lub DataTemplate

Mam niestandardowy słownik zasobów zgodny ze wspólnym podejściem do udostępniania instancji zasobów.

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

To działa dobrze, ale gdy jest on określany wewnątrz elementu zasobów w ControlTemplate i DataTemplate, istnieje fałszywych błędy pokazane (te nie wpływają na build, który nadal powiedzie) .

To jeden dostaje pokazane dla standardowego ResourceDictionary który zawiera SharedResourceDictionary w swoich połączonych słowników: XAML

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

próbki:

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

Czy ktoś ma jakieś pomysły w jaki sposób można wyeliminować tę niedogodność błąd?

Dzięki

+0

Wspólne podejście? Czy masz jakieś linki do szerszej dyskusji na temat tej techniki? –

+0

Oto jeden ... jest ich więcej, które wykopię później, gdy będę mieć czas. http://softnotes.wordpress.com/2011/04/05/shared-resourcedictionary-for-silverlight/ –

+0

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

Odpowiedz

Powiązane problemy