Pergunta

Eu tenho uma pele de bases e vários usuários em uma DLL separada do meu aplicativo WPF.

Dependendo de quem estiver usando o aplicativo, a pele base e uma das peles do usuário serão mescladas em um dicionário de recursos e carregadas para o aplicativo usar.

O que estou buscando é a capacidade de especificar um estilo em um arquivo Baseskin e, em um arquivo específico, pode substituí -lo, alterando quaisquer propriedades que eu precise.

Eu sei que posso conseguir isso usando o atributo baseado em base como este:

Base:

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

Do utilizador:

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

O problema é que agora os elementos precisam ter um estilo de alfândega, que pode realmente não ser implementado. Existe alguma maneira de que os dois estilos usem a mesma tecla (ButtonBG) e, quando mesclados, procure o aplicativo um estilo chamado ButtonBG no usuário primeiro e, se não existir, use o da base?

Eu estava pensando que, se eu pudesse dar o nome da assembléia no atributo baseado em apontar para o arquivo baseskin, poderia evitar erros de nomeação quando lhes der a mesma chave, mas não consigo encontrar nenhuma maneira de fazer isso. As outras opções são apenas forçar uma implementação de cada estilo, mesmo que nada seja alterado ou verifique programaticamente nas peles, mas esses são os últimos resorts.

Foi útil?

Solução

Você pode tentar tirar proveito da lógica de pesquisa de recursos. Quando o WPF está tentando encontrar um recurso pela chave, ele primeiro olhe no elemento atual ResourceDictionary, então seus pais, então os pais disso, e assim por diante.

Então, como você disse que é condicional para o usuário, isso pode ser mesclado no ResourceDictionary no Window nível enquanto sua base original está no Application nível.

Editar: Eu tenho informações melhores. A partir de Msdn em dicionários mesclados:

Comportamento de dicionário mesclado

Os recursos em um dicionário mesclado ocupam um local no escopo de pesquisa de recursos que é logo após o escopo do principal dicionário de recursos em que são mesclados. Embora uma chave de recurso deva ser única em qualquer dicionário individual, uma chave pode existir várias vezes em um conjunto de dicionários mesclados. Nesse caso, o recurso retornado virá do último dicionário encontrado sequencialmente na coleção MergedDicties. Se a coleção MergedDictionaries foi definida em XAML, a ordem dos dicionários mesclados na coleção é a ordem dos elementos fornecidos na marcação. Se uma chave for definida no dicionário primário e também em um dicionário que foi mesclado, o recurso retornado virá do dicionário primário. Essas regras de escopo se aplicam igualmente para referências de recursos estáticos e referências dinâmicas de recursos.

Isso significa que você pode definir sua pele de base em um diferente ResourceDictionary e mesclar em outro ResourceDictionary. Peça à pele do usuário neste último e o encontrará primeiro, caso contrário, continuará perfurando o dicionário mesclado que contém base. Cada um dos seus dicionários de usuário pode mesclar o dicionário básico e você apenas carregar o dicionário de usuário no aplicativo em vez de ambos separadamente.

Outras dicas

Você pode nomear sua base como baseButtonbg e quando você não mescla um recurso baseado em usuários, mescla um genérico contendo:

<Style x:Key="ButtonBg" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonBg}"/>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top