2010-09-29 13 views
9

Esta es probablemente una pregunta realmente estúpida, pero no puedo resolverlo.Cómo definir recursos Y un MergeDictionary con una clave en una página SL4

Tengo una página con un MergeDictionary definido:

<navigation:Page.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="../Assets/TourneySetupStyles.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </navigation:Page.Resources> 

y me refiero a los estilos en TourneySetupStyles.xaml en mi XAML como esto sin ningún problema:

<TextBlock Text="Tourney Name:" Style="{StaticResource TourneySetupTextStyle}" /> 

Sin embargo, ahora necesito añadir otro recurso página como esta:

Pero ahora el diseñador lanza una advertencia: "El diseñador no soporta diccionarios de carga que se mezclan elementos 'ResourceDictionary' sin una llave y otros elementos de la misma colección. Asegúrese de que la propiedad 'Recursos' no contenga elementos 'ResourceDictionary' sin una clave, o que el elemento 'ResourceDictionary' sea el único elemento en la colección. "

Así que agrego una clave a mi ResourceDictionary de esta manera: .

<navigation:Page.Resources> 
     <local:Tournament x:Key="tournament" /> 
     <ResourceDictionary x:Key="whatever"> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="../Assets/TourneySetupStyles.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 

    </navigation:Page.Resources> 

y la advertencia desaparece pero ahora mi referencia al estilo de TourneySetupStyles ya no funciona:

"no se puede encontrar un recurso con el Nombre/clave TourneySetupTextStyle"

así que supongo que la búsqueda ion is: ¿Cómo accedo al estilo ahora que ResourceDictionary está codificado?

+0

Gracias! Tengo el mismo error (en WPF) y tu solución funciona. – Noich

Respuesta

1

suspiro parece que el orden de las declaraciones es importante, tan pronto como muevo el primer recurso hasta ahora funciona:

<navigation:Page.Resources> 
    <ResourceDictionary x:Key="TourneySetupStyles"> 
      <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="../Assets/TourneySetupStyles.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    <local:Tournament x:Key="tourneySetupViewModel" /> 
</navigation:Page.Resources> 

Si alguien puede explicar por qué sería grande para referencia futura ...

8

Me acabo de topar con esto hoy - Estoy compilando de forma cruzada con WPF/Silverlight. Coloque el recurso local dentro del nodo ResourceDictionary, no coloque una clave x: en el nodo ResourceDictionary.

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/mydll;component/folder/MyResDict.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 

     <LinearGradientBrush x:Key="OrangeGradient" 
          EndPoint="0.5,1" 
          MappingMode="RelativeToBoundingBox" 
          StartPoint="0.5,0"> 
      <LinearGradientBrush.RelativeTransform> 
       <RotateTransform CenterY="0.5" 
            CenterX="0.5" /> 
      </LinearGradientBrush.RelativeTransform> 
      <GradientStop Color="#FFF3801E" /> 
      <GradientStop Color="#FFEDB17E" 
          Offset="0.5" /> 
      <GradientStop Color="#FFF3801E" 
          Offset="1" /> 
     </LinearGradientBrush> 
    </ResourceDictionary> 
</UserControl.Resources> 

No puedo explicar por qué - pero sé que funciona ...

hth

+1

Hmm, ¿así que no obtienes el error de tiempo de diseño con ese código? – Rodney

+0

Oh no ... pero abandoné a los diseñadores en VS y Blend aproximadamente 2 semanas después de comenzar a escribir el código compilado cruzado. Simplemente no funcionan. – chadbr

+0

Si quiero usar los diseñadores, utilizo un proyecto separado de WPF o Silverlight, hago mi trabajo de diseño, luego lo traigo a mi proyecto "real" y entiendo cómo obtenerlo para la compilación cruzada. Conseguir que el diseño se cargue en el diseñador después de eso es casi imposible. He abierto un problema de conexión abierta que está siendo trabajado por MS, pero en realidad no va a ninguna parte. – chadbr

0

me encontré con el mismo problema.

Resolví la cuestión de definir mi diccionario se fusiona dentro del archivo xaml de la aplicación en lugar de la vista en sí.

Ex:

<ResourceDictionary> 

     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Resources\Brushes\Brushes_Dictionary.xaml" /> 
      <ResourceDictionary Source="Resources\Storyboards\Storyboard_Dictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 

    </ResourceDictionary> 

</Application.Resources> 

+0

Hola Scott, ¿mi solución no funcionó para ti? – Rodney

0

Sí, acabo sido mordido por esto. ¡Tan pronto como Silverlight carga el diccionario de recursos fusionados, elimina todos los recursos locales que ya ha agregado! En mi caso, necesito agregar un recurso mediante programación antes de la llamada a InitalizeComponent(), pero dado que UserControl incluye un ResourceDictionary fusionado, ese recurso se pierde. En mi humilde opinión, esto es un error en Silverlight.

Pero poner recursos locales después de que ResourceDictionary funcione para casos como el suyo, entonces lo he votado.

Cuestiones relacionadas