XAML — MergedDictionaries выдает исключение XmlParseException «элемент уже добавлен».Почему?

StackOverflow https://stackoverflow.com/questions/2040804

Вопрос

У меня есть следующая, очень легко воспроизводимая проблема:Я создаю приложение 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>

Я не понимаю, почему при использовании объединенных ресурсов выдается исключение.Конечно, на данный момент исправить это достаточно просто (переместить ресурсы на более низкий уровень).Было бы неплохо узнать, является ли это «нормальным» поведением...

Это было полезно?

Решение

Если ваши ресурсы не расположены в отдельном файле, они не должны быть частью объединенных словарей.Переместите их наружу следующим образом:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top