2010-01-11 7 views
6

Tengo el siguiente problema, muy fácil de reproducir: Estoy creando una aplicación xaml que utiliza recursos de otro archivo. El camino a seguir es crear un MergedDictionaries-tag para combinar los recursos locales y globales, así:XAML - MergedDictionaries throwing XmlParseException "el elemento ya se ha agregado". ¿Por qué?

<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 nos quitar el MergedDictionaries-tag, se ejecuta como se esperaba el código:

<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 (mueva los recursos a un nivel inferior). Sería bueno saber si esto es un comportamiento "normal" ...

+1

Información adicional para las personas que buscan ese mensaje de error específico: Encontré este problema cuando accidentalmente utilizo dos estilos con el mismo 'TargetType' y ningún atributo' x: Key'. Eliminar uno de ellos (por ejemplo, fusionando sus contenidos en el otro) resolvió este problema para mí. – Jan

Respuesta

10

Si sus recursos no están ubicados en un archivo separado, entonces no deberían formar parte de los diccionarios fusionados. 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.

+0

Ok, ya veo, ¡gracias por la información! – RoelF

Cuestiones relacionadas