2010-01-11 7 views
6

J'ai le problème suivant, très facile à reproduire: Je crée une application xaml qui utilise les ressources d'un autre fichier. Le chemin à parcourir est de créer un MergedDictionaries-tag pour fusionner les ressources locales et mondiales, comme celui-ci:XAML - MergedDictionaries lançant XmlParseException "l'élément a déjà été ajouté". Pourquoi?

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

Ce petit morceau de code se bloque si vous l'exécutez:

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

Si nous retirer la MergedDictionaries-étiquette, le code se déroulera comme prévu:

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

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

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

Je ne comprends pas pourquoi il jette l'exception lorsque nous utilisons des ressources Fusionné. Bien sûr, le correctif est assez facile pour le moment (déplacez les ressources à un niveau inférieur). Il serait bon de savoir si c'est un comportement «normal» ...

+1

Informations supplémentaires pour les personnes recherchant ce message d'erreur spécifique: J'ai rencontré ce problème en utilisant accidentellement deux styles avec le même attribut 'TargetType' et aucun attribut' x: Key'. Enlever l'un d'entre eux (par exemple en fusionnant son contenu dans l'autre) a résolu ce problème pour moi. – Jan

Répondre

10

Si vos ressources ne se trouvent pas dans un fichier séparé, elles ne doivent pas faire partie des dictionnaires fusionnés. Déplacez l'extérieur comme ceci:

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

Cela dit, le message d'erreur est un peu trompeur et peut être le résultat d'un bogue dans le compilateur XAML.

+0

Ok, je vois, merci pour l'information! – RoelF

Questions connexes