Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Thomas Lebrun

Tout sur WPF, LINQ, C# et .NET en général !

Actualités

[WPF] Changer dynamiquement le style de votre application

Frédéric Queudret nous a déjà expliqué, via son blog, comment externaliser les styles WPF en assembly satellite.

En partant de son idée, je me suis dis qu'il serait intéressant de proposer un mécanisme permettant aux utilisateurs d'offrir, dans leur application, un système pour changer de style/thèmes et cela de façon dynamique (autrement dit sans avoir besoin de recompiler l'application) Smile

L'astuce, pour parvenir à nos fins, est d'utiliser un peu de Reflection. Au chargement de notre application, nous allons scanner le répertoire dans lequel nous avons stocké les assemblys correspondants à nos styles, afin de répertorier l'ensemble de nos ResourceDictionary:

private void WindowLoaded(object sender, RoutedEventArgs e)

{

        CustomStyles styles = new CustomStyles();

 

        string[] files = Directory.GetFiles("Styles", "*.dll");

 

        foreach (string file in files)

        {

             Assembly asm = Assembly.LoadFrom(file);

             Type[] types = asm.GetTypes();

 

             foreach (Type t in types)

             {

                 if (t.BaseType == typeof(ResourceDictionary))

                 {

                     ResourceDictionary rd = (ResourceDictionary)Activator.CreateInstance(t);

 

                     styles.Add(new CustomStyle(t.Name, rd));

                 }

             }

         }

 

         // lb est une ListBox

         this.lb.DataContext = styles;

}

Ensuite, à chaque fois que l'on change d'élément dans notre ListBox, on récupère le bon ResourceDictionary et on l'applique/l'ajoute au ressources de notre formulaire:

private void ListBoxSelectionChanged(object sender, SelectionChangedEventArgs e)

{

    CustomStyle selectedStyle = e.AddedItems[0] as CustomStyle;

 

    // Si le style sélectionné existe déjà, on le supprime.

    if (this.Resources.MergedDictionaries.Contains(selectedStyle.ResourceDictionary))

    {

        this.Resources.MergedDictionaries.Remove(selectedStyle.ResourceDictionary);

    }

 

    this.Resources.MergedDictionaries.Add(selectedStyle.ResourceDictionary);

}

Et voila, par simple sélection d'un des éléments de votre ListBox, vous changez le style appliqué au bouton. L'avantage de cette technique est qu'il vous suffit de rajouter une nouvelle assembly dans le répertoire "Styles" et de relancer l'application pour voir le nouveau style apparaitre dans la ListBox.

Bien sur, certains points pourraient être améliorés mais au travers de cet exemple, vous aurez au moins compris le principe Wink

 

J'ai mis une application d'exemple en pièce jointe de ce post.

 

A+

 

del.icio.us tags:
 
Technorati tags:
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: jeudi 10 mai 2007 09:47 par Thomas LEBRUN
Classé sous : ,

Attachment(s): ChangeStyleDynamically.zip

Commentaires

Thomas LEBRUN a dit :

Alors Xavier, toi qui étais pressé de voir mon post, qu'en penses-tu ? :)

# mai 10, 2007 20:47
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01