Précédent   Forum du club des développeurs et IT Pro > Dotnet > Développement Windows > Windows Presentation Foundation
Windows Presentation Foundation Forum d'entraide sur le développement d'applications Windows avec Windows Presentation Foundation
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/11/2012, 23h21   #1
infosam76
Membre Expert
 
Homme Eric Metz
Développeur informatique
Inscription : avril 2006
Messages : 518
Détails du profil
Informations personnelles :
Nom : Homme Eric Metz
Âge : 36
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : avril 2006
Messages : 518
Points : 1 608
Points : 1 608
Par défaut WPF -Ajouter un thème standard à son application

Bonjour,

J'ai lu qu'il était possible d'appliquer des thèmes standard style Aero ou autre à une application WPF. J'utilise le FrameWork 4.0. J'ai 2 questions :

- Existe t'il un thème pour Windows 7 (Aéro était Vista si je me trompe) voir Windows 8 ?
- Quelqu'un aurait t'il un bout de code fonctionnel ou un tutoriel un minimum complet, car j'ai trouvé bcp de lien traitant du sujet, mais je dois avouer que je suis un peu perdu.

En test j'ai créé une simple fenêtre comprenant un bouton avec le code suivant mais je ne vois pas de différence :

Code :
1
2
3
4
5
6
7
8
 
<Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/PresentationFramework.Classic;component/themes/classic.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
Aurais je oublié quelque chose à rajouter dans le code behind peut être.

Merci pour votre aide
infosam76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2012, 15h08   #2
uluquiorra
Invité régulier
 
Inscription : avril 2009
Messages : 32
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 32
Points : 7
Points : 7
Salut, tu devrais regarder Expression Blend, ça marche vraiment bien.

Un aperçu de leur tutos :
http://www.microsoft.com/expression/...Day.aspx?day=1
uluquiorra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2012, 21h07   #3
infosam76
Membre Expert
 
Homme Eric Metz
Développeur informatique
Inscription : avril 2006
Messages : 518
Détails du profil
Informations personnelles :
Nom : Homme Eric Metz
Âge : 36
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : avril 2006
Messages : 518
Points : 1 608
Points : 1 608
Citation:
Envoyé par uluquiorra Voir le message
Salut, tu devrais regarder Expression Blend, ça marche vraiment bien.

Un aperçu de leur tutos :
http://www.microsoft.com/expression/...Day.aspx?day=1
Bonjour,

Je connais un peu le concept, mais je travaille avec les outils gratuits vu que c'est une autoformation. La société ou je travaille utilise essentiellement VB6 et Java. Mais ayant développé en .net je n'ai pas envie de perdre mes connaissances dans ce domaine. Si je ne me trompe pas Expression Blend n'a hélas pas de version Express comme visual studio.
infosam76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 11h48   #4
uluquiorra
Invité régulier
 
Inscription : avril 2009
Messages : 32
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 32
Points : 7
Points : 7
Non, en effet la version d'essai se bloque au bout de 60 jours.
Si tu veux regarder dans le gratuit, y'a des choses comme :

http://www.equals-forty-two.com/2010.../?show=gallery
http://blogs.msdn.com/b/davrous/arch...-gratuits.aspx

qui ont l'air pas mal.
uluquiorra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 13h50   #5
infosam76
Membre Expert
 
Homme Eric Metz
Développeur informatique
Inscription : avril 2006
Messages : 518
Détails du profil
Informations personnelles :
Nom : Homme Eric Metz
Âge : 36
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : avril 2006
Messages : 518
Points : 1 608
Points : 1 608
Merci Merci

Le deuxième j'ai déjà fait quelques tests. Ce qui m’intéresse surtout c'est de comprendre le fonctionnement. Je n'en suis pas encore au niveau de créer une application complétement fonctionnelle (enfin si je pourrais mais sans utiliser les nouveautés comme le binding ou linq, et je pense que se serait dommage de s'en priver).
infosam76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 21h40   #6
MABROUKI
Membre Expert
 
mebarek
Inscription : avril 2008
Messages : 1 043
Détails du profil
Informations personnelles :
Nom : mebarek
Âge : 53

Informations forums :
Inscription : avril 2008
Messages : 1 043
Points : 1 547
Points : 1 547
bonjour binou....

Pour changer un theme pour ton appli (un theme est un fichier systeme -et fait partie du systeme car les users ont d'habitude de relouquer tout par un click dans le panneau de confoguration).....et je dis bien -toute l'appli- en WPF c'est facile.....
Par ailleurs à ne pas confondre avec un "skin" (propre à une ou plusieurs fenetres ou controles) qui se reduit à un simple dictionary (styles des fenetres ou controles concernes )lui aussi changeable à volonte par l'user d'une appli.....
Pour se limiter aux themes systemes contenus dans des fichiers .dll du GAC(dossier C:\WINDOWS\Microsoft.NET\assembly\GAC_MSIL\PresentationFramework.Aero...etc idem pour les autres themes)
Voici d'abord comment les referencer en xaml ou dans le code:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
 <!--ce qui suit est un explicatif indiquant comment specifier la reference du fichier system  dll theme concerne :-->
        <!--Aero—The default theme for Windows Vista
 
        Source="/
        PresentationFramework.Aero,
        Version=3.0.0.0,
        Culture=neutral,
        PublicKeyToken=31bf3856ad364e35
        ;component/themes/
        aero.normalcolor.xaml" />-->
 
 
        <!--Luna, Default—The XP theme in the regular blue color mode
 
        Source="/
        PresentationFramework.Luna,
        Version=3.0.0.0,
        Culture=neutral,
        PublicKeyToken=31bf3856ad364e35
        ;component/themes/
        luna.normalcolor.xaml" />-->
 
        <!--Luna, Metallic—The XP theme with the silver styling
 
        Source="/
        PresentationFramework.Luna,
        Version=3.0.0.0,
        Culture=neutral,
        PublicKeyToken=31bf3856ad364e35
        ;component/themes/
        luna.metallic.xaml" />-->
 
        <!--Luna, Homestead—The green XP theme
 
        Source="/
        PresentationFramework.Luna,
        Version=3.0.0.0,
        Culture=neutral,
        PublicKeyToken=31bf3856ad364e35
        ;component/themes/
        luna.homestead.xaml" />-->
 
    <!--Royale—The theme used by Windows Media Center edition
        Source="/
        PresentationFramework.Royale,
        Version=3.0.0.0,
        Culture=neutral,
        PublicKeyToken=31bf3856ad364e35
        ;component/themes/
        royale.normalcolor.xaml" />-->
    <!--Windows Classic—The Windows 2000/2003 look
 
        Source="/
        PresentationFramework.Classic,
        Version=3.0.0.0,
        Culture=neutral,
        PublicKeyToken=31bf3856ad364e35
        ;component/themes/
        Classic.xaml" />-->
chaque fichier est dans un sous/dossier dont le nom est :
"<version><PublicKeyToken> .
PublicKeyToken : veut dire Signature à Nom Fort......ou cle de chiffrage de l'assembly dll....

Venons-en au plus pratique.
Pour pouvoir changer le theme d'une appli en entier il faut que dans le fichier App.xaml de l'appli :
- le 1er Merged Dictionary(indice zero dans Collection des Merged Dictionary de l'appli) soit reserve au dico theme ....
- suivi des les autres Merged Dictionaries de l'appli(resources de styles,de datatemplates et autres controls templates habituels...)....

Pourquoi le 1er ? Parce que il n' y a moyen dans l'API d'identifier un dico particulier autrement dans cette Collection des Merged Dictionary ....

C'est ce dico qui est affecte initialement à l'appli et que nous allons changer
par 3 buttons dans l'exemple :
-le 1er charge : Aero—The default theme for Windows Vista
-le 2eme charge : Windows Classic—The Windows 2000/2003 look
-le 3eme restaure le theme initial(Luna, Default—The XP theme in the regular blue color mode).....
Pourquoi au niveau appli?Parce que c'est un theme .Au niveau d'une fenetre c'est plutot un skin qu'il faut....
code xaml du app.xam:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
<!--fichier app.xaml-->
 
    <Application x:Class="WpfLoadingTheme.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!--1er merged dico de l'appli (index 0) par defaut-->
               <!--Luna, Default—The XP theme in the regular blue color mode-->
                <ResourceDictionary    Source="/
                        PresentationFramework.Luna,
                        Version=3.0.0.0,
                        Culture=neutral,
                        PublicKeyToken=31bf3856ad364e35
                        ;component/themes/luna.normalcolor.xaml"/>
                   <!--eventuels merged  dico de resources etc...propres à l'application
                      simple dico vide de test à creer pour le test-->
                <ResourceDictionary  Source="MyLocalResources.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>
code xaml du window:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
<Window x:Class="WpfLoadingTheme.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel  >
        <StackPanel Orientation="Horizontal">
           <Button 
               Margin="10"
               Content="Button"/>
            <Label  
                 Margin="10"
                Content="Label"/>
            <TextBox 
                 Margin="10"
                Text="textbox "/>
        </StackPanel>
        <StackPanel  
            Orientation="Horizontal">
            <RadioButton 
                 Margin="10"
                Content="RadioButton"/>
            <CheckBox
                Margin="10"
                Content="CheckBox"/>
        </StackPanel>
        <StackPanel 
             Name="paneltheme">
            <Button 
                Name="btnAeroVista"
                Content="AeroVista"
                Click="btnAeroVista_Click">
            </Button>
            <Button 
                Name="btnClassic"
                Content="Classic"
                Click="btnClassic_Click">
            </Button>
 
            <Button 
                Name="btnRestorLunaDefault"
                Content="LunaDefault"
                Click="btnRestorLunaDefault_Click">
            </Button>
        </StackPanel>
    </StackPanel>
</Window>
code behind .cs du window:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace WpfLoadingTheme
{
    /// <summary>
    /// Logique d'interaction pour MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        object deftheme;
        public MainWindow()
        {
            InitializeComponent();
 
            //sauve theme par default
 
            if (Application.Current.Resources.MergedDictionaries.Count > 0)
            {
                //sauve theme par default
                deftheme = Application.Current.Resources.MergedDictionaries[0];
            }
        }
 
 
        /* click to changes the theme for the  all the Application  */
 
        //switch to : Windows Classic—The Windows 2000/2003 look
 
        private void btnClassic_Click(object sender, RoutedEventArgs e)
        {
 
            Uri uriToTheme = new Uri( "/PresentationFramework.Classic,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35 ;component/themes/Classic.xaml",
                 UriKind.Relative);
            object theme = Application.LoadComponent(uriToTheme);
 
            if (Application.Current.Resources.MergedDictionaries.Count > 0)
            {
 
                //change le merged dico indice 0 (theme)
                Application.Current.Resources.MergedDictionaries[0] = (ResourceDictionary)theme;
 
            }
 
 
 
        }
 
        //switch to : Aero—The default theme for Windows Vista
        private void btnAeroVista_Click(object sender, RoutedEventArgs e)
        {
            Uri uriToTheme = new Uri("/PresentationFramework.Aero,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35;component/themes/aero.normalcolor.xaml",
               UriKind.Relative);
            object theme = Application.LoadComponent(uriToTheme);
 
            if (Application.Current.Resources.MergedDictionaries.Count > 0)
            {
                //change le merged dico indice 0 (theme)
                Application.Current.Resources.MergedDictionaries[0] = (ResourceDictionary)theme;
 
            }
 
        }
 
        //restore theme courant
        private void btnRestorLunaDefault_Click(object sender, RoutedEventArgs e)
        {
            if (deftheme != null)
            {
                Application.Current.Resources.MergedDictionaries[0] = (ResourceDictionary)deftheme;
            }
 
        }
 
 
    }
}
bon code et bonne soiree........................
MABROUKI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 14h57   #7
infosam76
Membre Expert
 
Homme Eric Metz
Développeur informatique
Inscription : avril 2006
Messages : 518
Détails du profil
Informations personnelles :
Nom : Homme Eric Metz
Âge : 36
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : avril 2006
Messages : 518
Points : 1 608
Points : 1 608
Merci bien cela marche très bien.

J'ai comparé à ce que j'avais fait et je pense que c'est la notion du merged dico en index 0 qui ne fonctionnait pas.

J'ai également jeté un coup d'oeil au "skin" mais j'ai vu sur le forum que le plus souvent il fallait passer par le WPF Toolkit, dont le développement me semble un peu au point mort. Donc je suis un peu réticent à l'utiliser pour l'instant pour des raisons de fiabilité. Mais je dois continuer mes tests sur le sujet .

En tout cas merci bien pour l'explication bien détaillée.
infosam76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h36.


 
 
 
 
Partenaires

Hébergement Web