XAML - MergedDictionaries que lanza el XmlParseException “objeto ya ha sido añadido”. ¿Por qué?

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

Pregunta

Tengo el siguiente, muy fácil de reproducir el problema: Estoy creando una aplicación XAML que utiliza los recursos de otro archivo. El camino a seguir es crear un MergedDictionaries-tag para combinar los recursos locales y globales, así:

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

Esta pequeña pieza de código se bloqueará si lo ejecuta:

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

Si eliminamos la MergedDictionaries-etiqueta, el código se ejecutará como se espera:

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

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

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

No entiendo por qué se produce la excepción cuando usamos Recursos fusionada. Por supuesto, la solución es bastante fácil por ahora (mover los recursos a un nivel inferior). Sería bueno saber si este es un comportamiento 'normal' ...

¿Fue útil?

Solución

Si los recursos no se encuentran en un archivo separado, entonces no deberían formar parte de los diccionarios fusionadas. Moverlos fuera de la siguiente manera:

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

Dicho esto, el mensaje de error es un poco engañoso y puede ser el resultado de un error en el compilador XAML.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top