Pregunta

Tengo un BaseSkin y varios UserSkins en una dll separada de mi aplicación WPF.

Dependiendo de quién use la aplicación, la máscara base y una de las máscaras de usuario se fusionarán en un diccionario de recursos y se cargarán para que la aplicación las use.

Lo que busco es la capacidad de especificar un estilo en un archivo BaseSkin, y luego, en un archivo UserSkin específico, podrá sobrescribirlo, cambiando las propiedades que necesito.

Sé que puedo lograr esto utilizando el atributo BasedOn de esta manera:

Base:

<Style x:Key="ButtonBg" TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Green"/>
</Style>

Usuario:

<Style x:Key="CustomButtonBg" TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonBg}">
    <Setter Property="Background" Value="Blue"/>
</Style>

El problema es que ahora los elementos deben tener un estilo de CustomButtonBg que puede no estar implementado. ¿Hay alguna forma de que ambos estilos utilicen la misma clave (ButtonBg), y cuando se combinen, haga que la aplicación busque un estilo llamado ButtonBg en Usuario primero, y si no existe uno, use el de base?

Estaba pensando que si pudiera dar el nombre del conjunto en el atributo BasedOn para apuntar hacia el archivo BaseSkin, podría evitar los errores de nombre cuando les doy la misma clave, pero no puedo encontrar la manera de hacerlo. Las otras opciones son simplemente forzar una implementación de cada estilo, incluso si no se cambia nada, o verificar programáticamente en las máscaras, pero esos son los últimos recursos.

¿Fue útil?

Solución

Puedes intentar aprovechar la lógica de búsqueda de recursos. Cuando WPF intenta encontrar un recurso por clave, primero busca en el ResourceDictionary del elemento actual, luego en su padre, luego en el padre, y así sucesivamente.

Entonces, como dijo que está condicionado por el usuario, eso podría fusionarse en el ResourceDictionary en el nivel de Window mientras que su base original está en la aplicación nivel.

Editar: Tengo mejor información. De MSDN en los diccionarios combinados :

  

Comportamiento del diccionario combinado

     

Los recursos en un diccionario combinado ocupan una ubicación en el ámbito de búsqueda de recursos que está justo después del alcance del diccionario de recursos principal en el que se fusionan. Aunque una clave de recurso debe ser única dentro de cualquier diccionario individual, una clave puede existir varias veces en un conjunto de diccionarios combinados. En este caso, el recurso que se devuelve provendrá del último diccionario encontrado de forma secuencial en la colección MergedDictionaries. Si la colección MergedDictionaries se definió en XAML, el orden de los diccionarios combinados en la colección es el orden de los elementos tal como se indica en el marcado. Si se define una clave en el diccionario principal y también en un diccionario que se fusionó, entonces el recurso que se devuelve provendrá del diccionario principal. Estas reglas de alcance se aplican por igual tanto a las referencias de recursos estáticos como a las referencias de recursos dinámicos.

Eso significa que puedes definir tu aspecto Base en un ResourceDictionary diferente y fusionarlo en otro ResourceDictionary . Tenga la máscara de Usuario en el último, y la encontrará primero, de lo contrario seguirá explorando el diccionario combinado que contiene Base. Cada uno de sus diccionarios de usuario puede combinar el diccionario base y usted simplemente carga el diccionario de usuario en la aplicación en lugar de ambos por separado.

Otros consejos

Podría simplemente nombrar a su Base como BaseButtonBg y cuando no fusione un ResourceDictionary basado en el usuario, fusione uno genérico que contiene:

<Style x:Key="ButtonBg" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonBg}"/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top