2009-08-04 13 views
131

He estado tratando de encontrar la forma de organizar mis archivos ResourceDictionary para su reutilización y uso compartido con otros miembros de mi equipo.¿Qué tiene de especial Generic.xaml?

Sigo encontrándome con "Generic.xaml", pero si miro en MSDN para Generic.xaml o simplemente hago una búsqueda en Google, parece que solo recibo publicaciones en el blog y preguntas del foro que lo mencionan, puedo Parece que no tocó nada 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. Por ejemplo,:

<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 varias "apariencias" (es decir, si tengo solo un tema)?

+4

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

Respuesta

128

Cada control en WPF tiene un estilo predeterminado que proporciona, entre otras cosas, el valor predeterminado ControlTemplate 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, p. Ej. 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, 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 al DefaultStyleKeyProperty.OverrideMetadata en el constructor estático, pero luego debe proporcionar el estilo completo, incluido ControlTemplate.

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

+0

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 derivada de Button), esto no se consideraría parte de un "tema"? – devuxer

+0

Sí, si solo desea volver a configurar o volver a diseñar un control estándar, utilice el elemento de recursos normal en UserControl/Window/Application/Whatever level. Puede usar un estilo con una clave implícita (http://msdn.microsoft.com/en-us/library/ms750613.aspx#stylesimplicitkeys) para cambiar todos los controles de un tipo determinado. –

+0

@Phil El enlace ya no funciona – Zaheylu

89

Para un archivo generic.xaml (mayúsculas y minúsculas) a ser algo especial, dos condiciones deben cumplirse:

  • debe estar en la carpeta Themes sub-raíz en el proyecto
  • El montaje debe marcarse con el ThemeInfoAttribute (por lo general en AssemblyInfo.cs)

Entonces sirve como la ubicación de búsqueda por defecto para cualquier estilo por defecto que desea 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, esto se logra con cierta codificación, esta técnica simplemente define el diccionario de recursos predeterminado.

+3

¿Puedes aclarar a qué te refieres con "estilos predeterminados"?¿Significa esto que todos los botones tomarán automáticamente un estilo cuyo TargetType es "Botón"? ¿O todavía necesito hacer referencia a 'x: Key' escribiendo'

+3

Otra pregunta para ayudarme a entender esto: ¿es Generic.xaml el equivalente de WPF de un archivo CSS que definió el aspecto predeterminado de diferentes elementos, por ejemplo, 'h1 {color: # 00ff00}'? – devuxer

+2

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ías pensarlo de esa manera, con respecto al comportamiento predeterminado. –

Cuestiones relacionadas