2009-08-26 18 views
73

Escribo varios controles de usuario de WPF que necesitan recursos compartidos e individuales.Cómo combinar recursos importados y locales en el control de usuario de WPF

he dado cuenta de la sintaxis de los recursos de carga de un archivo de recursos independiente:

<UserControl.Resources> 
    <ResourceDictionary Source="ViewResources.xaml" /> 
</UserControl.Resources> 

Sin embargo, cuando hago esto, no puedo añadir también los recursos a nivel local, como:

<UserControl.Resources> 
    <ResourceDictionary Source="ViewResources.xaml" /> 
    <!-- Doesn't work: --> 
    <ControlTemplate x:Key="validationTemplate"> 
     ... 
    </ControlTemplate> 
    <style x:key="textBoxWithError" TargetType="{x:Type TextBox}"> 
     ... 
    </style> 
    ... 
</UserControl.Resources> 

I He echado un vistazo a ResourceDictionary.MergedDictionaries, pero eso solo me permite fusionar más de un diccionario externo, no definir más recursos localmente.

Me falta algo trivial?

Cabe mencionar: estoy alojando mis controles de usuario en un proyecto de WinForms, por lo que poner recursos compartidos en App.xaml no es realmente una opción.

Respuesta

144

lo he descubierto. La solución consiste en MergedDictionaries, pero los detalles deben ser los adecuados, así:

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="ViewResources.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
     <!-- This works: --> 
     <ControlTemplate x:Key="validationTemplate"> 
      ... 
     </ControlTemplate> 
     <style x:key="textBoxWithError" TargetType="{x:Type TextBox}"> 
      ... 
     </style> 
     ... 
    </ResourceDictionary> 
</UserControl.Resources> 

Es decir, los recursos locales deben estar anidada dentro de la etiqueta ResourceDictionary. Entonces el ejemplo here es incorrecto.

4

Use MergedDictionaries.

que tiene el siguiente ejemplo de here.

Fichero1

<ResourceDictionary 
    xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation " 
    xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml " > 
    <Style TargetType="{x:Type TextBlock}" x:Key="TextStyle"> 
    <Setter Property="FontFamily" Value="Lucida Sans" /> 
    <Setter Property="FontSize" Value="22" /> 
    <Setter Property="Foreground" Value="#58290A" /> 
    </Style> 
</ResourceDictionary> 

Archivo 2

<ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="TextStyle.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
+0

Gracias, pero no hubo suerte. Su ejemplo parece correcto, pero en realidad no funciona. Aparece el mensaje "La propiedad 'Recursos' está configurada más de una vez". –

+0

Sé sobre MergedDictionaries. Pero no me permiten combinar una referencia de diccionario externa con recursos definidos localmente de la manera que quiero. Como ya se dijo, hay un ejemplo en la página a la que se refiere, pero no funciona. –

+0

ahh lo siento. No me di cuenta. –

4

Se pueden definir los recursos locales dentro de la sección MergedDictionaries:

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <!-- import resources from external files --> 
      <ResourceDictionary Source="ViewResources.xaml" /> 

      <ResourceDictionary> 
       <!-- put local resources here --> 
       <Style x:key="textBoxWithError" TargetType="{x:Type TextBox}"> 
        ... 
       </Style> 
       ... 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 
Cuestiones relacionadas