¿Qué tiene de especial Generic.xaml?

153

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

Sigo apareciendo "Generic.xaml", pero si busco en Generic.xaml en MSDN o simplemente hago una búsqueda en Google, solo parece que recibo publicaciones en el blog y preguntas en el foro que lo mencionan, 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 ResourceDictionaries almacenados en 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 solo tengo un tema)?

devuxer
fuente
66
No necesita fusionarse en el diccionario generic.xaml en su código, si lo está utilizando con controles personalizados (a diferencia de los controles de usuario).
Eternal21

Respuestas:

152

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

El nombre del diccionario de recursos depende del tema actual de Windows, por ejemplo, en 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, busca en Generic.xaml, es decir, los controles cuyo aspecto 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 DefaultStyleKeyProperty.OverrideMetadataal constructor estático, pero luego debe proporcionar el estilo completo, incluido ControlTemplate.

Tenga en cuenta que puede decirle 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.

Phil Devaney
fuente
Gracias Phil. Entonces, ¿está diciendo que si solo quisiera proporcionar un nuevo ControlTemplate para un control de botón normal (es decir, no escribir mi propia clase especial que se deriva de Button), esto no se consideraría parte de un "tema"?
devuxer
Sí, si solo desea cambiar la plantilla o cambiar el estilo de un control estándar, entonces utiliza el elemento Recursos normal en Control de usuario / Ventana / Aplicación / Cualquier nivel. Puede usar un estilo con una clave implícita ( msdn.microsoft.com/en-us/library/… ) para cambiar todos los controles de un tipo determinado.
Phil Devaney el
@Zaheylu Está funcionando ahora (creo que MS estaba actualizando sus documentos)
Alan McBee - MSFT
104

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

  • Debe estar en la carpeta de la raíz secundaria de Temas en el proyecto
  • El conjunto debe estar marcado con 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 TargetType como x: Key como el Tipo de control que se debe diseñar.

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

Kenan EK
fuente
3
¿Puedes aclarar lo que quieres decir con "estilos predeterminados"? ¿Significa esto que todos los botones adoptarían automáticamente un estilo cuyo TargetType es "Botón"? ¿O todavía necesito hacer referencia al x:Keyescrito <Button Style="{StaticResource MyButtonStyle}" />? ¿Qué sucede si ResourceDictionary contiene más de un estilo cuyo TargetType es "Button"? Gracias.
devuxer
3
Otra pregunta que ayuda a conseguir mi cabeza alrededor de esto: es el equivalente Generic.xaml WPF de un archivo CSS que define el aspecto predeterminado de los diferentes elementos, por ejemplo, h1 {color:#00ff00}?
devuxer
3
Sí, el estilo predeterminado se aplicaría sin hacer referencia explícita a la clave, y dos estilos idénticos darían el error de que hay dos claves idénticas en el diccionario. Y sí, podría pensarlo de esa manera, con respecto al comportamiento predeterminado.
Kenan EK
3
Solo quería agregar eso, aunque es cierto que existen restricciones especiales en el archivo generic.xaml, la entrada del diccionario dentro de generic.xaml puede ser un diccionario combinado cuyas entradas pueden hacer referencia a cualquier cosa.
Tormod