2010-08-06 21 views
23

Estoy recibiendo el siguiente error:XAML: La propiedad 'Recursos' se configura más de una vez

The property 'Resources' is set more than once.

Aquí es mi XAML:

<UserControl.Resources> 
    <!--Resource dictionaries for framework stuff--> 
    <ResourceDictionary> 
     <Style x:Key="MultiLineTextBox" TargetType="TextBox"> 
      <Setter Property="BorderThickness" Value="0"/> 
      <Setter Property="TextWrapping" Value="WrapWithOverflow"/> 
     </Style> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/View;component/Common/ResourceDictionary.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 

    <!--Convertors needed for proper display--> 
    <c:CollapsedIfNegative x:Key="CollapseIfNegative"/> 
    <c:VisibleIfNegative x:Key="MakeVisibleIfNegative"/> 
    <c:ErrorCodeToString x:Key="ConvertErrorCodeToString"/> 
</UserControl.Resources> 

Respuesta

47

El .Resources propiedad en XAML es inteligente: es el tipo ResourceDictionary pero, si usted no pone explícitamente una etiqueta <ResourceDictionary> en torno a su contenido, el compilador mágicamente suponer una para ti. Es por eso que generalmente puedes simplemente poner tus pinceles directamente en el marcado.

Sin embargo, ha comenzado colocando su propio ResourceDictionary, que sospecho que ha impedido ese comportamiento automático, por lo que el compilador cree que está intentando establecer más de un valor. Si se vuelve a escribir como éste debe obtener el resultado que busca es:

<UserControl.Resources> 
    <!--Resource dictionaries for framework stuff--> 
    <ResourceDictionary> 
     <!--Convertors needed for proper display--> 
     <!-- move this INSIDE the ResourceDictionary tag --> 
     <c:CollapsedIfNegative x:Key="CollapseIfNegative"/> 
     <c:VisibleIfNegative x:Key="MakeVisibleIfNegative"/> 
     <c:ErrorCodeToString x:Key="ConvertErrorCodeToString"/> 


     <Style x:Key="MultiLineTextBox" TargetType="TextBox"> 
      <Setter Property="BorderThickness" Value="0"/> 
      <Setter Property="TextWrapping" Value="WrapWithOverflow"/> 
     </Style> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/View;component/Common/ResourceDictionary.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 
+0

Esto funciona, pero no entiendo por qué tiene problemas con los convertidores siendo el último elemento en pero no tiene problema con que sean los primeros. –

+1

En su ejemplo, no están dentro del 'ResourceDictionary' en absoluto. Creo que el elemento 'MergedDictionaries' tiene que ser el primero o el último, pero aparte de eso, el orden no importa. –

+3

Esta oración vale su peso en oro: "si no coloca explícitamente una etiqueta alrededor de su contenido, el compilador asumirá mágicamente una para usted", muchas gracias. –

0

En realidad, la copia de su XAML y pegándolo en mis propias compilaciones UserControl bien (siempre que agregue las clases de convertidor referenciadas).

¿Ve algún otro error en su lista de errores o es este el único? A veces, si ocurre otro error (como la falla al buscar un recurso), podría causar otro error de compilación.

+0

error \t \t 45 elementos de propiedad no puede ser en el medio del contenido de un elemento. Deben ser antes o después del contenido. –

Cuestiones relacionadas