Quando si crea un custom control è possibile far si che il look dello stesso di adatti al tema di Windows attualmente selezionato, per far questo esiste un apposita procedura che, brevemente, consiste nel creare in un folder chiamato Themes una serie di ResourceDictionaries con dei nomi ben precisi (ad esempio in Vista il nome è Aero.NormalColor.Xaml) contenenti le risorse da applicare tema per tema al nostro controllo.
Affinchè il tutto funzioni è necessario modificare il file app.config e indicare a WPF dove cercare le risorse per il tema attualmente selezionato.

[assembly: ThemeInfo(
        ResourceDictionaryLocation.SourceAssembly, //where theme specific resource dictionaries are located
        ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
   )]
In questo caso ho indicato che sia la fallback resource (indicata dal ResourceDictionary col nome Generic.xaml)che le eventuali risorse associate a un tema
sono nella stessa assembly che contiene i controlli da stilizzare.
Tutto questo però è vero solo in presenza di un Custom Control,se applicassi la stessa tecnica ai controlli standard"di WPF scoprirei che
il tutto non funziona in quanto questi hanno già uno stile di default associato ai vari temi.
Per modificare questo comportamento e applicare quando detto in precedenza anche a controlli di WPF è necessario usare la markup extension
ThemeDictionary modificando il file App.Xaml in questo modo.
<Application x:Class="D05_ThemedControls.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="{ThemeDictionary YourAssemblyName}" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>
Dove YourAssemblyName è il nome dell'assembly che contiene i vari ResourceDictionaries.
image Vista Theme Capture Classic Theme image Struttura
Le due figure mostrano il pulsante cambiare in base al tema di Windows selezionato.
Lo xaml utilizzato è:
<Window x:Class="D05_ThemedControls.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="You can style standard controls too!" Height="300" Width="300">
    <Grid>
            <Button Height="49" Margin="73,28,73,0" Name="button1" VerticalAlignment="Top">Button</Button>
        <TextBlock Height="18" Margin="59,0,53,80" Name="textBlock1" VerticalAlignment="Bottom" >
            The magic is ThemeDictionary            
            </TextBlock>
    </Grid>
</Window>
Cool!
Technorati Tags: ,,