style online modern metro for example wpf xaml themes

wpf - online - ¿Qué tiene de especial Generic.xaml?



wpf themes (2)

He estado tratando de descubrir cómo organizar mis archivos ResourceDictionary para reutilizarlos y compartirlos con otros miembros de mi equipo.

Siempre me encuentro con "Generic.xaml", pero si miro en MSDN para Generic.xaml o simplemente hago una búsqueda en Google, parece que solo recibo publicaciones de blogs y preguntas de foros que por casualidad lo menciono, parece que no puedo golpear algo realmente autoritario y claro.

¿Cuál es la diferencia entre Generic.xaml y MyRandomlyNamedResourceDictionary.xaml? Parece que de cualquier manera, tengo que hacer referencia a los ResourceDictionaries almacenados en las bibliotecas con el atributo Source. P.ej,:

<Application.Resources> <ResourceDictionary Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" </Application.Resources>

Entonces, ¿qué ventaja proporciona Generic.xaml exactamente? ¿Tiene algún propósito si no estoy tratando de darle a mi aplicación múltiples "miradas" (es decir, si tengo solo un tema)?


Cada control en WPF tiene un estilo predeterminado que proporciona, entre otras cosas, ControlTemplate predeterminado del control. WPF busca el estilo predeterminado en un diccionario de recursos especial en la carpeta Temas en el mismo ensamblaje que el control. La clave para el estilo predeterminado la proporciona la propiedad de dependencia Control.DefaultStyleKey , cuyo valor predeterminado se anula en cada subclase de Control.

El nombre del diccionario de recursos depende del tema actual de Windows, por ejemplo, Vista usando el tema Aero, el diccionario se llama Aero.NormalColor.xaml, en XP usando el tema predeterminado es Luna.NormalColor.xaml. Si el estilo no se encuentra en el diccionario de temas, se ve en Generic.xaml, es decir, para los controles cuya apariencia no depende del tema.

Esto solo se aplica a cualquier control personalizado que haya definido, es decir, clases derivadas de Control, directa o indirectamente. Puede cambiar el estilo predeterminado para un control estándar derivando de él y llamando a DefaultStyleKeyProperty.OverrideMetadata en el constructor estático, pero luego debe proporcionar el estilo completo, incluido ControlTemplate.

Tenga en cuenta que puede indicarle a WPF que busque en un ensamblaje externo su estilo predeterminado utilizando el atributo ThemeInfo. El ensamblaje externo debe llamarse < YourAssembly > . < ThemeName > .dll por ejemplo PresententationFramework.Aero.dll.


Para que un archivo generic.xaml (sin distinción entre mayúsculas y minúsculas) sea algo especial, se deben cumplir dos condiciones:

  • Debe estar en la carpeta sub-raíz Temas en el proyecto
  • El ensamblaje debe estar marcado con el ThemeInfoAttribute (generalmente en AssemblyInfo.cs )

Luego sirve como la ubicación de búsqueda predeterminada para cualquier estilo predeterminado que desee aplicar a sus Controles. Tenga en cuenta también que para que un estilo sea el predeterminado, debe declarar tanto su TargetType como x: Key como el tipo de control que se diseñará.

Si desea agregar temas enteros y el cambio de tema a su aplicación, eso se logra con cierta codificación, esta técnica simplemente define el diccionario de recursos predeterminado.