2010-01-11 31 views
6

我有以下內容,很容易重現問題: 我正在創建一個使用另一個文件資源的xaml應用程序。去的方法是創建一個MergedDictionaries標籤合併本地和全球的資源,像這樣:XAML - MergedDictionaries拋出XmlParseException「item已被添加」。爲什麼?

<Window> 
<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="path.to.xaml.file"/> 
      <ResourceDictionary> 
       <Style TargetType="{x:Type Border}" x:Key="TypeBlock"> 

       </Style> 
       <Style TargetType="{x:Type Border}" x:Key="SetBlock"> 

       </Style> 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 
.... 
</Window> 

這一小段代碼將崩潰,如果你運行它:

Item has already been added. Key in dictionary: 'System.Windows.Controls.Border' Key being added: 'System.Windows.Controls.Border' 

如果我們除去MergedDictionaries標籤,代碼將按照預期運行:

<Window> 
<Window.Resources> 
    <Style TargetType="{x:Type Border}" x:Key="TypeBlock"> 

    </Style> 
    <Style TargetType="{x:Type Border}" x:Key="SetBlock"> 

    </Style> 
</Window.Resources> 
</Window> 

我不明白爲什麼它會拋出當我們使用合併資源除外。 當然,現在修復很容易(將資源移動到較低級別)。這將是很高興知道這是否是'正常'的行爲...

+1

有關搜索特定錯誤消息的人員的其他信息:當意外地使用具有相同'TargetType'且無'x:Key'屬性的兩種樣式時,我遇到了此問題。刪除其中的一個(例如,通過將其內容合併到另一箇中)解決了我的這個問題。 – Jan 2012-01-13 16:19:16

回答

10

如果您的資源不位於一個單獨的文件,那麼他們不應該是合併字典的一部分。向外移動的他們是這樣的:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="path.to.xaml.file"/> 
     </ResourceDictionary.MergedDictionaries> 

     <Style TargetType="{x:Type Border}" x:Key="TypeBlock"> 

     </Style> 
     <Style TargetType="{x:Type Border}" x:Key="SetBlock"> 

     </Style> 
    </ResourceDictionary> 
</Window.Resources> 

這就是說,該錯誤信息是有點誤導,並可能在XAML編譯器錯誤的結果。

+0

好吧,我明白了,謝謝你提供的信息! – RoelF 2010-01-11 10:06:05

相關問題