2012-06-07 18 views
6

Tengo una ventana WPF que se supone que carga dos imágenes vectoriales de archivos XAML. (Cada uno está en un archivo separado para facilitar la modificación en Expression Design.)Obtener un recurso de ResourceDictionary con una clave

Cuando incluyo los archivos XAML en un MergedDictionary, funciona bien. Este es el código que utilizo:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Images/LCCD logo.xaml" /> 
      <ResourceDictionary Source="Images/LCCD bottom image.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 

y

<Image Source="{Binding Source={StaticResource LCCDlogo}}" /> <!-- Simplified --> 
<Image Source="{Binding Source={StaticResource LCCDbar}}" /> <!-- Simplified --> 

Sin embargo, ahora necesita agregar más a los recursos de la ventana. El nuevo recurso pertenece a esta ventana, por lo que queremos que esté en el mismo archivo en lugar de un archivo incluido.

Al agregar el siguiente código entre <Window.Resources> y <ResourceDictionary>, me sale el siguiente error:

Código

<Style TargetType="{x:Type tab:FabTabItem}"> 
     <Setter Property="Header" Value="{Binding Path=LabelText}"/> 
     <Setter Property="HeaderTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal" Margin="0,0,4,0"> 
         <TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis"/> 
        </StackPanel> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Advertencia

The designer does not support loading dictionaries that mix 'ResourceDictionary' items without a key and other items in the same collection. Please ensure that the 'Resources' property does not contain 'ResourceDictionary' items without a key, or that the 'ResourceDictionary' item is the only element in the collection.

Así que cambiar el <ResourceDictionary> etiqueta a esto:

<ResourceDictionary x:Key="Images"> 

Sin embargo, ahora no sé cómo acceder a los recursos dentro de este Diccionario. ¿Cómo se obtienen los recursos desde dentro de un nombre ResourceDictionary?


EDITAR

No importa. Esto compila pero no se ejecuta.

El error es:

''Resources' property has already been set on 'MainWindow'.

supongo que tendré que hacerlo de otra manera.

Respuesta

8

De acuerdo con la página de MSDN en MergedResourceDictionary's es legal pero no es común definir un recurso en un diccionario de recursos que se especifica en un Dictábano_Formado. Desde la página de arriba

It is legal to define resources within a ResourceDictionary that is specified as a merged dictionary, either as an alternative to specifying Source, or in addition to whatever resources are included from the specified source. However, this is not a common scenario; the main scenario for merged dictionaries is to merge resources from external file locations. If you want to specify resources within the markup for a page, you should typically define these in the main ResourceDictionary and not in the merged dictionaries.

Así que pruébalo para ver si funciona.

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Images/LCCD logo.xaml" /> 
      <ResourceDictionary Source="Images/LCCD bottom image.xaml" /> 
      <ResourceDictionary> 
       <Style TargetType="{x:Type tab:FabTabItem}"> 
        <Setter Property="Header" Value="{Binding Path=LabelText}"/> 
        <Setter Property="HeaderTemplate"> 
         <Setter.Value> 
          <DataTemplate> 
           <StackPanel Orientation="Horizontal" Margin="0,0,4,0"> 
            <TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis"/> 
           </StackPanel> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 
+0

Parece que funciona, y es una respuesta mucho mejor que la mía. –

+0

@MosheKatz Me alegra ayudar –

1

Terminé moviendo el <Style> más abajo en el archivo, en el elemento padre de los elementos que usan ese estilo.

No es la mejor solución, pero funciona.

Cuestiones relacionadas