2012-11-22 10 views
5

EDIT:この問題は標準の.NET ResourceDictionaryを使用する場合にも発生し、コントロールまたはデータテンプレート内でリソースディクショナリを使用する際の問題と思われます。ControlTemplateまたはDataTemplate内のカスタムリソース辞書

私は、リソースインスタンスを共有する共通のアプローチに従ったカスタムリソースディクショナリを持っています。

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

それは正常に動作しますが、それはのControlTemplateまたはDataTemplateの内部リソース要素内で参照されるたびに、(これらはまだ成功したビルドを、影響はありません)に示す偽のエラーがあります。

この1は、そのマージされた辞書にSharedResourceDictionaryが含まれている標準のResourceDictionaryのために示します:

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

サンプル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> 

誰もが、私はこの厄介なエラーを排除することができますどのように任意のアイデアを持っていますか?

ありがとうございます。

+0

一般的なアプローチですか?あなたはこのテクニックに関するより幅広い議論へのリンクを持っていますか? –

+0

ここに1つは...私は時間があるときに私が後で掘り出すことがより多くあります。 http://softnotes.wordpress.com/2011/04/05/shared-resourceced-for-silverlight/ –

+0

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

答えて

関連する問題