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)?
Respuestas:
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 laControl.DefaultStyleKey
propiedad 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.OverrideMetadata
al 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.fuente
Para que un
generic.xaml
archivo (sin distinción entre mayúsculas y minúsculas) sea algo especial, se deben cumplir dos condiciones:ThemeInfoAttribute
(generalmente enAssemblyInfo.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.
fuente
x:Key
escrito<Button Style="{StaticResource MyButtonStyle}" />
? ¿Qué sucede si ResourceDictionary contiene más de un estilo cuyo TargetType es "Button"? Gracias.h1 {color:#00ff00}
?