2012-06-22 14 views
12

Creé un conjunto de biblioteca de clases en el que creé controles personalizados, y definí los estilos predeterminados en el archivo generic.xaml.Los estilos de generic.xaml no se aplican

Parece que este es un problema bastante común, siempre y cuando muchas personas lo publiquen. Sin embargo, no pude encontrar ninguna respuesta útil para mi caso.

  • the generic.xaml se encuentra en la carpeta Temas.
  • el archivo generix.xaml Build Action está establecido en Page.
  • ThemeInfo está definido correctamente en mi AssemblyInfo.cs.

En mi aplicación de prueba, si puedo combinar manualmente el archivo generic.xaml de mis controles personalizados conjunto en la aplicación App.xaml archivo de la siguiente manera:

<Application.Resources> 
    <ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/MyControlsAssembly;component/Themes/generic.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

continuación, los controles personalizados son adecuadamente temático, pero si no fusiono manualmente el generic.xaml, los controles aparecen con el tema predeterminado de Windows.

¿Podría decirme qué estoy olvidando y/o estoy equivocado?

Otros detalles:

  • Mi ThemeInfo atributo de ensamblado se define de la siguiente manera:

    [assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)]

    (Nota: el resultado es el mismo con cualquier combinación de parámetros para el atributo ThemeInfo)

  • Hay otros dos archivos .xaml junto al archivo generic.xaml en la carpeta Temas.

  • Hay una subcarpeta en la carpeta Temas que a su vez contiene otro archivo .xaml.
+4

Do usted todavía tiene DefaultStyleKeyProperty en un constructor estático en sus controles personalizados? – Nogusta

+0

¿Alguna suerte descubriendo esto? Casi tengo exactamente lo mismo con mi ensamblaje de controles personalizados. Si agrego una referencia en App.config al archivo generic.xaml, los controles son temáticos. Si dejo esto, no consigo nada. –

+0

¿Es válido este enlace? http://social.msdn.microsoft.com/Forums/vstudio/en-US/2e1fb162-e828-4fd9-832f-d2791c1980b4/isnt-genericxaml-supposed-to-loaded-automatically Tomé estoy enfrentando el mismo problema, y creo que esta es la causa raíz –

Respuesta

7

Usted necesitará la siguiente línea en el constructor de control personalizado:

public class MyCustomControl : Control 
{ 
    static MyCustomControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl))); 
    } 
} 

Entonces, si usted tiene un archivo dentro de la carpeta generic.xaml temas, con la siguiente muestra de estilo:

<Style TargetType="{x:Type local:MyCustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MyCustomControl}"> 
       <Border> 
        <Label>Testing...</Label> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Ahora el estilo se aplicará automáticamente sin ninguna fusión adicional.

+0

Esto no funciona para mí. Mire mi comentario sobre la pregunta inicial – bigfoot

+0

Comience con una solución en blanco y vea si puede lograr que funcione desde allí. – Eternal21

+0

Eso es lo que estoy haciendo. Me deriva de Xceed Data Grid. Si creo un nuevo MyControl: Control o MyButton: Button, funciona. Tal vez sea la compatibilidad con el tema Xceed lo que entre en juego aquí, y necesito examinar sus tutoriales sobre temas, o simplemente aceptar el diccionario de combinación en mi aplicación. A menos que surjan otras ideas. – bigfoot

3

Para aplicar estilos predeterminados en Themes \ Generic.xaml en mi biblioteca de controles personalizados, decidí buscar inspiración en una biblioteca bien establecida de controles de código abierto (MahApps). Este proyecto le brinda un excelente ejemplo de cómo estructurar y diseñar una biblioteca de controles personalizados.

cortar una larga historia corta, para conseguir sus estilos predeterminados en Temas \ Generic.xaml que debe incluir lo siguiente en el archivo AssemblyInfo.cs en su biblioteca de controles personalizados:

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] 

En mi caso, mis controles personalizados AssemblyInfo.cs parecía algo así como:

using System.Runtime.InteropServices; 
using System.Windows; 
using System.Windows.Markup; 

[assembly: AssemblyCopyright("...")] 
[assembly: ComVisible(false)] 

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] 

[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyFileVersion("1.0.0.0")] 
[assembly: AssemblyInformationalVersion("1.0.0.0")] 
[assembly: AssemblyTitleAttribute("...")] 
[assembly: AssemblyDescriptionAttribute("")] 
[assembly: AssemblyProductAttribute("...")] 
[assembly: AssemblyCompany("...")] 
0

No estoy seguro si esto funciona en WPF, pero funciona para mí en Silverlight:

Constructor:

public class MyCustomControl : Control 
{ 
    static MyCustomControl() 
    { 
     this.Style = (Style)Application.Current.Resources["MyCustomControlStyle"]; 
    } 
} 

Estilo:

<Style x:Key="MyCustomControlStyle" TargetType="{local:MyCustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{local:MyCustomControl}"> 
       <Border> 
        <Label>Testing...</Label> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
Cuestiones relacionadas