Eu tenho tentado descobrir como organizar meus arquivos ResourceDictionary para reutilização e compartilhamento com outros membros da minha equipe.
Eu continuo encontrando o "Generic.xaml", mas se eu procurar no Generic.xaml no MSDN ou apenas faço uma pesquisa no Google, apenas recebo postagens de blog e perguntas do fórum que mencionam isso - não consigo encontre algo realmente autoritário e claro.
Qual é a diferença entre Generic.xaml e MyRandomlyNamedResourceDictionary.xaml? Parece que de qualquer maneira, eu tenho que fazer referência a ResourceDictionaries armazenados em bibliotecas com o atributo Source. Por exemplo,:
<Application.Resources>
<ResourceDictionary
Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>
Então, que vantagem o Generic.xaml oferece exatamente? Isso tem algum objetivo se eu não estiver tentando fornecer ao meu aplicativo várias "aparências" (ou seja, se eu tiver apenas um tema)?
Respostas:
Todo controle no WPF possui um estilo padrão que fornece, entre outras coisas, o padrão do controle
ControlTemplate
. O WPF procura o estilo padrão em um dicionário de recursos especial na pasta Temas no mesmo assembly que o controle. A chave para o estilo padrão é fornecida pelaControl.DefaultStyleKey
propriedade dependency, cujo valor padrão é substituído em cada subclasse de Control.O nome do dicionário de recursos depende do tema atual do Windows, por exemplo, no Vista, usando o tema Aero, o dicionário é chamado Aero.NormalColor.xaml, no XP, usando o tema padrão, Luna.NormalColor.xaml. Se o estilo não for encontrado no dicionário de temas, ele procurará em Generic.xaml, ou seja, controles cuja aparência não depende do tema.
Isso se aplica apenas a quaisquer controles personalizados que você definiu, ou seja, classes derivadas de Control, direta ou indiretamente. Você pode alterar o estilo padrão de um controle padrão derivando dele e chamando
DefaultStyleKeyProperty.OverrideMetadata
o construtor estático, mas precisará fornecer o estilo completo, incluindo ControlTemplate.Observe que você pode dizer ao WPF para procurar em um assembly externo o seu estilo padrão usando o atributo ThemeInfo. A montagem externa deve ter o nome
<
YourAssembly>
.<
ThemeName>
.dll, por exemplo, PresententationFramework.Aero.dll.fonte
Para que um
generic.xaml
arquivo (sem distinção entre maiúsculas e minúsculas) seja algo especial, duas condições devem ser atendidas:ThemeInfoAttribute
(geralmente emAssemblyInfo.cs
)Em seguida, ele serve como o local de pesquisa padrão para todos os estilos padrão que você deseja aplicar aos seus controles. Observe também que, para um estilo ser o padrão, ele deve declarar o TargetType e x: Key como o Tipo de controle a ser estilizado.
Se você deseja adicionar temas inteiros e alternância de temas ao seu aplicativo, isso é feito com alguma codificação, essa técnica apenas define o dicionário de recursos padrão.
fonte
x:Key
escrevendo<Button Style="{StaticResource MyButtonStyle}" />
? O que acontece se o ResourceDictionary contiver mais de um estilo cujo TargetType seja "Button"? Obrigado.h1 {color:#00ff00}
,?