WPF permet à une bibliothèque de contrôles de fournir différents dictionnaires de ressources pour différents thèmes système, permettant essentiellement à une application de correspondre au thème visuel sélectionné du système d'exploitation (Aero, Luna, etc.). Je me demande si je peux inclure plusieurs dictionnaires de ressources de thème avec mon application et utiliser un support de thème existant dans le cadre. Cela devrait fonctionner pour mes propres noms de thème, et idéalement permettre à l'utilisateur de changer le thème et donc l'aspect dépouillé de l'application lors de l'exécution. Même s'il ne s'agissait que d'un réglage de configuration, cela pourrait être intéressant.Les thèmes WPF peuvent-ils être utilisés pour inclure plusieurs skins pour une application qui peut être modifiée lors de l'exécution?
Répondre
Voici un extrait de code que j'ai utilisé dans mon application qui prenait en charge les thèmes. Dans cet exemple, j'ai deux thèmes (Default et Classic XP). Les ressources de thème sont stockées respectivement dans DefaultTheme.xaml et ClassicTheme.xaml.
C'est le code par défaut dans mon App.xaml
<Application ...>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ArtworkResources.xaml" />
<ResourceDictionary Source="DefaultTheme.xaml" />
</ResourceDictionary.MergedDictionaries>
<Style x:Key="SwooshButton" TargetType="ButtonBase">
<!-- style setters -->
</Style>
<!-- more global styles -->
</ResourceDictionary>
</Application.Resources>
</Application>
Puis dans le code derrière la App.xaml je la méthode suivante pour permettre de changer le thème. Fondamentalement, ce que vous faites est effacer les dictionnaires de ressources, puis recharger le dictionnaire avec le nouveau thème.
private Themes _currentTheme = Themes.Default;
public Themes CurrentTheme
{
get { return _currentTheme; }
set { _currentTheme = value; }
}
public void ChangeTheme(Themes theme)
{
if (theme != _currentTheme)
{
_currentTheme = theme;
switch (theme)
{
default:
case Themes.Default:
this.Resources.MergedDictionaries.Clear();
AddResourceDictionary("ArtworkResources.xaml");
AddResourceDictionary("DefaultTheme.xaml");
break;
case Themes.Classic:
this.Resources.MergedDictionaries.Clear();
AddResourceDictionary("ArtworkResources.xaml");
AddResourceDictionary("ClassicTheme.xaml");
break;
}
}
}
void AddResourceDictionary(string source)
{
ResourceDictionary resourceDictionary = Application.LoadComponent(new Uri(source, UriKind.Relative)) as ResourceDictionary;
this.Resources.MergedDictionaries.Add(resourceDictionary);
}
Ce que vous aurez également besoin de garder à l'esprit cette approche est que tous les styles qui utilisent un thème devront avoir une ressource dynamique. Par exemple:
<Window Background="{DynamicResource AppBackgroundColor}" />
Je ne connais pas de façon de faire cela dans le cadre, mais vous pouvez le faire si vous stylisez chaque contrôle qui peut changer vous-même.
La théorie est de faire un style DynamicResource
puis de charger le ResourcesDictionary
en fonction de la configuration des utilisateurs pour le style différent.
Here est un article qui a un exemple.
- 1. peut être une boucle longue pour être brisée en plusieurs tranches de fil en C#
- 2. Une variable peut-elle être modifiée dans un bloc?
- 3. Comme peut être ajusté dans une application WPF développée pour changer la résolution?
- 4. ce qui peut être la regex pour la chaîne suivante
- 5. Tous les pilotes disponibles pour ODBC vers Sybase qui peuvent être utilisés avec QTP?
- 6. Une application winform peut-elle être basculée vers une application WPF si l'architecture MVC est utilisée?
- 7. Application de thèmes Office 2007 pour l'application WPF
- 8. NSAlert peut-il être utilisé pour créer une fenêtre flottante?
- 9. Peut-être sqlite être une base de données inmemory également?
- 10. Y at-il une bibliothèque javascript qui peut être utilisée pour filtrer les chaînes pour les attaques XSS?
- 11. Comment le code peut-il être une ressource pour Restful?
- 12. Can XpsDocuments peut-il être sérialisé en XML pour être stocké dans une base de données?
- 13. Une application ClickOnce peut-elle être publiée sur Ubuntu?
- 14. Une application Web peut-elle vraiment être orientée objet?
- 15. Y a-t-il une classe de pointeur intelligent boost qui peut être configurée pour ne pas être détruite lors de la destruction?
- 16. Une application .NET peut-elle être compilée en natif?
- 17. Une application GNOME peut-elle être automatisée? Comment?
- 18. Peut Intelligencia.UrlRewriter être fait pour fonctionner dans IIS7?
- 19. Une application WinForms peut-elle être configurée pour s'exécuter en tant que "x86" sans recompilation?
- 20. menu déroulant question, peut être simple peut-être pas
- 21. Y at-il un didacticiel qui enseigne les idiomes communs de programmation Ruby utilisés par les programmeurs expérimentés, mais peut ne pas être évident pour les nouveaux arrivants?
- 22. Tomcat peut-il être configuré pour ne pas démarrer si une application Web ne démarre pas?
- 23. Les schémas de serveur SQL doivent-ils être utilisés pour le regroupement logique ou administratif?
- 24. Jquery SI peut-être?
- 25. Can Netbeans peut-il être utilisé comme IDE pour Sinatra?
- 26. Est-ce que les pixel shaders peuvent être utilisés lors du rendu sur une surface hors écran?
- 27. Incompatibilité du fichier de données SQL Server 2005 (peut-être 8 fichiers de données, peut-être 5, qui sait)
- 28. Quelles sont les récompenses prestigieuses pour lesquelles une application web ou une autre solution technologique peut être mise en candidature?
- 29. Quels outils, etc. peuvent être utilisés pour optimiser une application web PHP fonctionnant sur un serveur Windows 2003 IIS 6
- 30. Une session peut-elle être falsifiée?
bonne réponse, j'ai implémenté cela, je me demandais comment vous utiliseriez cela pour changer les images de boutons liés. J'ai posé une question ici: http://stackoverflow.com/questions/39795317/how-do-i-dynamically-change-which-resource-folder-i-get-an-image-from – AidanO