XAML - MergedDictionaries抛出XmlParseException“item has already been added”。为什么?

7
我有一个非常容易重现的问题: 我正在创建一个XAML应用程序,该应用程序使用来自另一个文件的资源。正确的方法是创建一个MergedDictionaries标签来合并本地和全局资源,如下所示:
<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
1个回答

11
如果你的资源不是在一个单独的文件中,那么它们不应该是合并字典的一部分。请将它们移到外部,像这样:
<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编译器中的一个bug导致的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接