IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Control de type bouton avec une image [Débutant]


Sujet :

Windows Presentation Foundation

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Control de type bouton avec une image
    Bonjour tout le monde,

    J'ai converti récemment mon programme développé en WinForms en WPF pour des raisons graphiques.

    Mon problème vient du fait de la disparition des picturebox.

    En effet, je veux créer des boutons à partir d'images que j'ai fait sous photoshop. Mon but est qu'elles aient 3 voir 4 fonds différents (en gros j'ai fait 4 versions d'un même bouton) :
    -une version lorsque le bouton est verrouillé
    -une lorsque l'on clique dessus
    -une lorsque la souris passe au dessus
    -une de base

    Avec le control PictureBox en WinForms je pouvais gérer ce comportement grâce aux évènements click, mouse over, ...

    Y a-t-il une solution équivalente en WPF ?

    Que ce soit à partir du control Button ou Image.
    Cela fait une semaine que je cherche sans trouver ce que je veux.

    On peut mettre une image source aux boutons mais celle-ci n'est pas modifiable via le code selon que l'utilisateur clique sur le bouton ou non par exemple.

    Cordialement.

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Il y a moyen de le faire "à la main" en utilisant les events mais la meilleure manière, selon moi, est avec les VisualStates. C'est plus dans la philosophie XAML

    Si tu n'a jamais utilisé les visual states, 2 tutoriels ici :

    http://elijahm.ninjuro.com/2012/01/0...es-in-wpf-4-0/


  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Perso je suis pas très fan du VisualStateManager, je trouve ça très lourd... Je préfère de loin utiliser les Trigger.

    Voilà un exemple de boutons avec 4 images pour les différents états :

    ImageButton.cs :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
        public class ImageButton : Button
        {
            static ImageButton()
            {
                DefaultStyleKeyProperty.OverrideMetadata(
                    typeof(ImageButton),
                    new FrameworkPropertyMetadata(typeof(ImageButton)));
            }
     
            public ImageSource NormalImage
            {
                get { return (ImageSource)GetValue(NormalImageProperty); }
                set { SetValue(NormalImageProperty, value); }
            }
     
            public ImageSource PressedImage
            {
                get { return (ImageSource)GetValue(PressedImageProperty); }
                set { SetValue(PressedImageProperty, value); }
            }
     
            public ImageSource HoverImage
            {
                get { return (ImageSource)GetValue(HoverImageProperty); }
                set { SetValue(HoverImageProperty, value); }
            }
     
            public ImageSource DisabledImage
            {
                get { return (ImageSource)GetValue(DisabledImageProperty); }
                set { SetValue(DisabledImageProperty, value); }
            }
     
            public Stretch Stretch
            {
                get { return (Stretch)GetValue(StretchProperty); }
                set { SetValue(StretchProperty, value); }
            }
     
            public static readonly DependencyProperty NormalImageProperty =
                DependencyProperty.Register("NormalImage", typeof(ImageSource), typeof(ImageButton), new PropertyMetadata(null));
     
            public static readonly DependencyProperty PressedImageProperty =
                DependencyProperty.Register("PressedImage", typeof(ImageSource), typeof(ImageButton), new PropertyMetadata(null));
     
            public static readonly DependencyProperty HoverImageProperty =
                DependencyProperty.Register("HoverImage", typeof(ImageSource), typeof(ImageButton), new PropertyMetadata(null));
     
            public static readonly DependencyProperty DisabledImageProperty =
                DependencyProperty.Register("DisabledImage", typeof(ImageSource), typeof(ImageButton), new PropertyMetadata(null));
     
            public static readonly DependencyProperty StretchProperty =
                DependencyProperty.Register("Stretch", typeof(Stretch), typeof(ImageButton), new PropertyMetadata(Stretch.Uniform));
     
     
        }

    Themes\Generic.xaml :

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        <Style TargetType="{x:Type local:ImageButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:ImageButton}">
                        <Image Name="img" Source="{TemplateBinding NormalImage}" Stretch="{TemplateBinding Stretch}" />
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="img" Property="Source" Value="{Binding HoverImage, RelativeSource={RelativeSource TemplatedParent}}" />
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter TargetName="img" Property="Source" Value="{Binding PressedImage, RelativeSource={RelativeSource TemplatedParent}}" />
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter TargetName="img" Property="Source" Value="{Binding DisabledImage, RelativeSource={RelativeSource TemplatedParent}}" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    Utilisation :

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            <local:ImageButton NormalImage="/Resources/normal.png"
                               HoverImage="/Resources/hover.png"
                               PressedImage="/Resources/pressed.png"
                               DisabledImage="/Resources/disabled.png"

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Points : 191
    Points
    191
    Par défaut
    Très intéressant, pour ma part je ne connaissais pas.
    Mais je vais m'y attardé un moment, merci pour ce partage !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonjour, tout d'abord merci de vos réponses. Je pense que la solution de tomlev convient mieux à ma situation.
    J'ai essayé donc de l'implanter comme présenté mais j'obtiens 2 erreurs lorsque j'ajoute ceci dans MainWindow.xaml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <local:ImageButton NormalImage="/Resources/normal.png"
                               HoverImage="/Resources/hover.png"
                               PressedImage="/Resources/pressed.png"
                               DisabledImage="/Resources/disabled.png"
    />
    Erreur 1 :
    Error 2 The type 'local:ImageButton' was not found. Verify that you are not missing an assembly reference and that all referenced assemblies have been built.
    Erreur 1 :
    Error 1 ''local' is an undeclared prefix. Line 25, position 10.' XML is not valid.
    Les deux erreurs sont évidemment liées et j'ai bien ajouté ImageButton.vb (converti) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Public Class ImageButton
        Inherits Button
        Shared Sub New()
            DefaultStyleKeyProperty.OverrideMetadata(GetType(ImageButton), New FrameworkPropertyMetadata(GetType(ImageButton)))
        End Sub
     
        Public Property NormalImage() As ImageSource
            Get
                Return DirectCast(GetValue(NormalImageProperty), ImageSource)
            End Get
            Set(value As ImageSource)
                SetValue(NormalImageProperty, value)
            End Set
        End Property
     
        Public Property PressedImage() As ImageSource
            Get
                Return DirectCast(GetValue(PressedImageProperty), ImageSource)
            End Get
            Set(value As ImageSource)
                SetValue(PressedImageProperty, value)
            End Set
        End Property
     
        Public Property HoverImage() As ImageSource
            Get
                Return DirectCast(GetValue(HoverImageProperty), ImageSource)
            End Get
            Set(value As ImageSource)
                SetValue(HoverImageProperty, value)
            End Set
        End Property
     
        Public Property DisabledImage() As ImageSource
            Get
                Return DirectCast(GetValue(DisabledImageProperty), ImageSource)
            End Get
            Set(value As ImageSource)
                SetValue(DisabledImageProperty, value)
            End Set
        End Property
     
        Public Property Stretch() As Stretch
            Get
                Return DirectCast(GetValue(StretchProperty), Stretch)
            End Get
            Set(value As Stretch)
                SetValue(StretchProperty, value)
            End Set
        End Property
     
        Public Shared ReadOnly NormalImageProperty As DependencyProperty = DependencyProperty.Register("NormalImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
        Public Shared ReadOnly PressedImageProperty As DependencyProperty = DependencyProperty.Register("PressedImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
        Public Shared ReadOnly HoverImageProperty As DependencyProperty = DependencyProperty.Register("HoverImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
        Public Shared ReadOnly DisabledImageProperty As DependencyProperty = DependencyProperty.Register("DisabledImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
        Public Shared ReadOnly StretchProperty As DependencyProperty = DependencyProperty.Register("Stretch", GetType(Stretch), GetType(ImageButton), New PropertyMetadata(Stretch.Uniform))
     
     
    End Class
    Et ceci à Generic.xaml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     <Style TargetType="{x:Type local:ImageButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:ImageButton}">
                        <Image Name="img" Source="{TemplateBinding NormalImage}" Stretch="{TemplateBinding Stretch}" />
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="img" Property="Source" Value="{Binding HoverImage, RelativeSource={RelativeSource TemplatedParent}}" />
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter TargetName="img" Property="Source" Value="{Binding PressedImage, RelativeSource={RelativeSource TemplatedParent}}" />
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter TargetName="img" Property="Source" Value="{Binding DisabledImage, RelativeSource={RelativeSource TemplatedParent}}" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    Ai-je fait une erreur de syntaxe ? J'ai réessayé plusieurs de rebuild mon projet avant et après la partie dans MainWindow.xaml mais sans succès.

    Cordialement.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Tu n'as pas déclaré le namespace dans le XAML. Il faut ajouter ça au niveau de l'élément racine:

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:local="clr-namespace:LeNamespace"
    (en remplaçant LeNamespace par le nom du namespace où tu as déclaré la classe ImageButton)

    De plus, je ne l'ai pas précisé parce que dans ma tête c'était évident, mais Generic.xaml doit contenir un ResourceDictionary qui contient le style, et non le style directement (Projet > Nouvel élément > Dictionnaire de ressources, et tu copies-colles le style à l'intérieur)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Merci, désolé pour mon inexpérience en XAML.
    J'avais bien le ResourceDictionnary.

    J'ai essayé sous plusieurs formes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:local="clr-namespace:nomprojet.ImageButton"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:local="clr-namespace:nomprojet.ImageButton;assembly=nomprojet.ImageButton"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:local="clr-namespace:ImageButton"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:local="clr-namespace:ImageButton;assembly=ImageButton"
    Mais j'ai toujours l'erreur comme laquelle l'assembly n'a pas été trouvée et que le namespace ne contient pas de public member.

    Mon projet contient pourtant le classe ImageButton.vb qui est compilée au projet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Namespace ImageButton
     
        Public Class ImageButton
            Inherits Button
            Shared Sub New()
                DefaultStyleKeyProperty.OverrideMetadata(GetType(ImageButton), New FrameworkPropertyMetadata(GetType(ImageButton)))
            End Sub
     
            Public Property NormalImage() As ImageSource
                Get
                    Return DirectCast(GetValue(NormalImageProperty), ImageSource)
                End Get
                Set(value As ImageSource)
                    SetValue(NormalImageProperty, value)
                End Set
            End Property
     
            Public Property PressedImage() As ImageSource
                Get
                    Return DirectCast(GetValue(PressedImageProperty), ImageSource)
                End Get
                Set(value As ImageSource)
                    SetValue(PressedImageProperty, value)
                End Set
            End Property
     
            Public Property HoverImage() As ImageSource
                Get
                    Return DirectCast(GetValue(HoverImageProperty), ImageSource)
                End Get
                Set(value As ImageSource)
                    SetValue(HoverImageProperty, value)
                End Set
            End Property
     
            Public Property DisabledImage() As ImageSource
                Get
                    Return DirectCast(GetValue(DisabledImageProperty), ImageSource)
                End Get
                Set(value As ImageSource)
                    SetValue(DisabledImageProperty, value)
                End Set
            End Property
     
            Public Property Stretch() As Stretch
                Get
                    Return DirectCast(GetValue(StretchProperty), Stretch)
                End Get
                Set(value As Stretch)
                    SetValue(StretchProperty, value)
                End Set
            End Property
     
            Public Shared ReadOnly NormalImageProperty As DependencyProperty = DependencyProperty.Register("NormalImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
            Public Shared ReadOnly PressedImageProperty As DependencyProperty = DependencyProperty.Register("PressedImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
            Public Shared ReadOnly HoverImageProperty As DependencyProperty = DependencyProperty.Register("HoverImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
            Public Shared ReadOnly DisabledImageProperty As DependencyProperty = DependencyProperty.Register("DisabledImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
            Public Shared ReadOnly StretchProperty As DependencyProperty = DependencyProperty.Register("Stretch", GetType(Stretch), GetType(ImageButton), New PropertyMetadata(Stretch.Uniform))
     
     
        End Class
     
    End Namespace
    Il me semble que je dois utiliser la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:local="clr-namespace:nomdemonnamespace;assembly=nomdelassembly"
    Puisque ma public class ImageButton est dans dans un public item class vb ajouté à mon projet, je pense devoir utiliser "assembly" d'après ce que j'ai lu sur internet. Mais je n'arrive pas à trouver son nom. Et bizarrement quand je met le nom de mon namespace il n'est pas reconnu puisque Visual Studio ne trouve pas de public class à l'intérieur de mon namespace.

    Cordialement.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Si la classe ImageButton est dans le même projet que là où tu l'utilises, pas besoin de préciser assembly

    Dans ton cas le namespace est juste ImageButton, mais je te conseille de le changer, car le fait de donner le même nom à la classe et au namespace risque de poser des problèmes (voir cet article). Mets plutôt le nom de ton projet comme namespace (c'est d'ailleurs ce qui est utilisé par défaut), et mets xmlns:local="clr-namespace:NomDeTonProjet".

    Mais j'ai toujours l'erreur comme laquelle l'assembly n'a pas été trouvée et que le namespace ne contient pas de public member.
    Tu vois cette erreur dans l'éditeur XAML ? As-tu essayé de compiler quand-même ? L'éditeur XAML ne voit pas les nouveaux types tant que le projet n'a pas été compilé, ce qui donne parfois des "fausses alertes"...

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    J'ai donc mis
    xmlns:local="clr-namespace:NomDeTonProjet"
    comme indiqué. (en remplaçant bien entendu par le nom de mon projet)
    Et j'ai donc modifié mon fichier ImageButton.vb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Namespace NomDeTonProjet
     
        Public Class ImageButton
            Inherits Button
            Shared Sub New()
                DefaultStyleKeyProperty.OverrideMetadata(GetType(ImageButton), New FrameworkPropertyMetadata(GetType(ImageButton)))
            End Sub
     
            Public Property NormalImage() As ImageSource
                Get
                    Return DirectCast(GetValue(NormalImageProperty), ImageSource)
                End Get
                Set(value As ImageSource)
                    SetValue(NormalImageProperty, value)
                End Set
            End Property
     
            Public Property PressedImage() As ImageSource
                Get
                    Return DirectCast(GetValue(PressedImageProperty), ImageSource)
                End Get
                Set(value As ImageSource)
                    SetValue(PressedImageProperty, value)
                End Set
            End Property
     
            Public Property HoverImage() As ImageSource
                Get
                    Return DirectCast(GetValue(HoverImageProperty), ImageSource)
                End Get
                Set(value As ImageSource)
                    SetValue(HoverImageProperty, value)
                End Set
            End Property
     
            Public Property DisabledImage() As ImageSource
                Get
                    Return DirectCast(GetValue(DisabledImageProperty), ImageSource)
                End Get
                Set(value As ImageSource)
                    SetValue(DisabledImageProperty, value)
                End Set
            End Property
     
            Public Property Stretch() As Stretch
                Get
                    Return DirectCast(GetValue(StretchProperty), Stretch)
                End Get
                Set(value As Stretch)
                    SetValue(StretchProperty, value)
                End Set
            End Property
     
            Public Shared ReadOnly NormalImageProperty As DependencyProperty = DependencyProperty.Register("NormalImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
            Public Shared ReadOnly PressedImageProperty As DependencyProperty = DependencyProperty.Register("PressedImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
            Public Shared ReadOnly HoverImageProperty As DependencyProperty = DependencyProperty.Register("HoverImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
            Public Shared ReadOnly DisabledImageProperty As DependencyProperty = DependencyProperty.Register("DisabledImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
            Public Shared ReadOnly StretchProperty As DependencyProperty = DependencyProperty.Register("Stretch", GetType(Stretch), GetType(ImageButton), New PropertyMetadata(Stretch.Uniform))
     
     
        End Class
     
    End Namespace
    Et lorsque que je fais build->build solution
    Je ne peux pas compiler car il y a des erreurs :
    Error 1 The tag 'ImageButton' does not exist in XML namespace 'clr-namespace:nomdemonprojet'. Line 25 Position 10.
    Error 2 Cannot find the type 'local:ImageButton'. Note that type names are case sensitive. Line 6 Position 12.
    Error 3 The type 'local:ImageButton' was not found. Verify that you are not missing an assembly reference and that all referenced assemblies have been built.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Bizarre... c'est les seules erreurs ?

    Si tu enlèves du XAML toutes les références à "local" ou "ImageButton", le projet compile bien ?

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Je viens de relancermon projet et maintenant je vois l'imagebutton dans l'éditeur visuel mais il y a toujours les mêmes erreurs.
    Lorsque j'enlève ceci de MainWindow.xaml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            <local:ImageButton NormalImage="Resources/image0.png"
                               HoverImage="Resources/image1.png"
                               PressedImage="Resources/image2.png"
                               DisabledImage="Resources/image3.png" Margin="228,298,249,43" />
    qui est placé dans grid et ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:local="clr-namespace:NomDeTonProjet"
    Je n'ai plus que l'erreur :
    Error 1 Cannot find the type 'local:ImageButton'. Note that type names are case sensitive. Line 6 Position 12.
    Qui vient de mon fichier Generic.xaml.

    Je le poste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:NomDeTonProjet">
     
        <Style TargetType="{x:Type local:ImageButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:ImageButton}">
                        <Image Name="img" Source="{TemplateBinding NormalImage}" Stretch="{TemplateBinding Stretch}" />
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="img" Property="Source" Value="{Binding HoverImage, RelativeSource={RelativeSource TemplatedParent}}" />
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter TargetName="img" Property="Source" Value="{Binding PressedImage, RelativeSource={RelativeSource TemplatedParent}}" />
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter TargetName="img" Property="Source" Value="{Binding DisabledImage, RelativeSource={RelativeSource TemplatedParent}}" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
     
    </ResourceDictionary>
    Et lorsque je rajoute ensuite les deux éléments supprimés du xaml seul le premier créé une erreur :
    Error 2 The type 'local:ImageButton' was not found. Verify that you are not missing an assembly reference and that all referenced assemblies have been built.
    Je pense donc que l'erreur vient du fichier generic.xaml.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    OK, mais si tu enlèves toutes les références à local ou ImageButton de tous les fichiers XAML (y compris generic.xaml), est-ce que la compilation passe ?

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Oui elle passe. C'est dans le generic.xaml que ça coince à mon avis.

    EDIT : je rajoute mon fichier MainWindow.xaml au cas où une coquille soit visible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:NomDuProjet"
        Title="MainWindow" Height="425" Width="595" AllowsTransparency="True" WindowStyle="None" ResizeMode="CanMinimize" MouseDown="Window_MouseDown" 
        <Window.Background>
            <ImageBrush ImageSource="Resources/bgtest.png" />
        </Window.Background>    
        <Grid Opacity="1">
            <local:ImageButton NormalImage="Resources/jouer0.png"
                               HoverImage="Resources/jouer1.png"
                               PressedImage="Resources/jouer2.png"
                               DisabledImage="Resources/jouerver.png" Margin="208,276,269,65" />
        </Grid>
     
    </Window>

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Bah là je vois plus alors...
    J'ai testé le code chez moi avant de le poster, ça marchait sans problème.

  15. #15
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Perso je suis pas très fan du VisualStateManager, je trouve ça très lourd... Je préfère de loin utiliser les Trigger.
    Je dirais oui et non. Oui parce que pour des cas simple c'est peut-être plus facile, non dans le sens ou c'est du legacy, autant s'habituer au VSM (Là j'ai une vision de portage sur SL ou WinRT). Ceci étant dit les 2 solutions sont valables (en tout cas pour les EventTrigger) et c'est juste un avis perso relativement partial

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par GuruuMeditation Voir le message
    Je dirais oui et non. Oui parce que pour des cas simple c'est peut-être plus facile, non dans le sens ou c'est du legacy, autant s'habituer au VSM (Là j'ai une vision de portage sur SL ou WinRT). Ceci étant dit les 2 solutions sont valables (en tout cas pour les EventTrigger) et c'est juste un avis perso relativement partial
    Oui mais bon, si le legacy est plus pratique que la nouvelle approche, c'est que l'évolution va pas dans le bon sens
    Après c'est vrai que le VSM est utile pour les cas plus complexes... Quand on commence à utiliser des MultiTriggers, c'est qu'on a atteint les limites des Triggers

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Je viens de créer un nouveau projet vierge.
    Composé de Dictionnary1.xaml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:test">
     
        <Style TargetType="{x:Type local:ImageButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:ImageButton}">
                        <Image Name="img" Source="{TemplateBinding NormalImage}" Stretch="{TemplateBinding Stretch}" />
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="img" Property="Source" Value="{Binding HoverImage, RelativeSource={RelativeSource TemplatedParent}}" />
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter TargetName="img" Property="Source" Value="{Binding PressedImage, RelativeSource={RelativeSource TemplatedParent}}" />
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter TargetName="img" Property="Source" Value="{Binding DisabledImage, RelativeSource={RelativeSource TemplatedParent}}" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
     
    </ResourceDictionary>
    ImageButton.vb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Namespace launcher_design_v1
     
        Public Class ImageButton
            Inherits Button
            Shared Sub New()
                DefaultStyleKeyProperty.OverrideMetadata(GetType(ImageButton), New FrameworkPropertyMetadata(GetType(ImageButton)))
            End Sub
     
            Public Property NormalImage() As ImageSource
                Get
                    Return DirectCast(GetValue(NormalImageProperty), ImageSource)
                End Get
                Set(value As ImageSource)
                    SetValue(NormalImageProperty, value)
                End Set
            End Property
     
            Public Property PressedImage() As ImageSource
                Get
                    Return DirectCast(GetValue(PressedImageProperty), ImageSource)
                End Get
                Set(value As ImageSource)
                    SetValue(PressedImageProperty, value)
                End Set
            End Property
     
            Public Property HoverImage() As ImageSource
                Get
                    Return DirectCast(GetValue(HoverImageProperty), ImageSource)
                End Get
                Set(value As ImageSource)
                    SetValue(HoverImageProperty, value)
                End Set
            End Property
     
            Public Property DisabledImage() As ImageSource
                Get
                    Return DirectCast(GetValue(DisabledImageProperty), ImageSource)
                End Get
                Set(value As ImageSource)
                    SetValue(DisabledImageProperty, value)
                End Set
            End Property
     
            Public Property Stretch() As Stretch
                Get
                    Return DirectCast(GetValue(StretchProperty), Stretch)
                End Get
                Set(value As Stretch)
                    SetValue(StretchProperty, value)
                End Set
            End Property
     
            Public Shared ReadOnly NormalImageProperty As DependencyProperty = DependencyProperty.Register("NormalImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
            Public Shared ReadOnly PressedImageProperty As DependencyProperty = DependencyProperty.Register("PressedImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
            Public Shared ReadOnly HoverImageProperty As DependencyProperty = DependencyProperty.Register("HoverImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
            Public Shared ReadOnly DisabledImageProperty As DependencyProperty = DependencyProperty.Register("DisabledImage", GetType(ImageSource), GetType(ImageButton), New PropertyMetadata(Nothing))
     
            Public Shared ReadOnly StretchProperty As DependencyProperty = DependencyProperty.Register("Stretch", GetType(Stretch), GetType(ImageButton), New PropertyMetadata(Stretch.Uniform))
     
     
        End Class
     
    End Namespace
    Et MainWindow.xaml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="test"
        Title="MainWindow" Height="350" Width="525">
        <Grid>
            <local:ImageButton NormalImage="Resources/image0.png"
                               HoverImage="Resources/image1.png"
                               PressedImage="Resources/image2.png"
                               DisabledImage="Resources/image3.png" Margin="208,276,269,65" />
        </Grid>
    </Window>
    Ces choses sont les seules que j'ai effectuées, il y a-t-il d'autres manipulations à faire pour qu'une namespace soit reconnu (autres que d'ajouter les balises manuellement dans le fichier ImageButton.vb ?

    J'ai toujours les 2 mêmes erreurs (je précise que je suis sous Visual Studio 2010) :
    Error 1 The tag 'ImageButton' does not exist in XML namespace 'test'. Line 7 Position 10.
    Error 2 The type 'local:ImageButton' was not found. Verify that you are not missing an assembly reference and that all referenced assemblies have been built.
    J'ai bien essayé de build le projet avant et après modif rien n'y change. C'est bizarre que cela marche de votre côté et que ça bug pour moi.

    Pouvez vous poster le code de vos pages ? Et me dire si vous avez fait autre chose qu'écrire ce code pour que cela marche ?

    Le problème vient du namespace qui n'est soit pas reconnu soit reconnu comme vide je pense.

    Cordialement.

    EDIT : faut-il faire des imports ou ajouter des références ?

  18. #18
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    bonjour

    Tes deboires avec le designer vs pour vb.net c'est que celui-ci se comporte differerement de celui de csharp:
    - pas besoin de namespace en vb.net pour les fichiers .vb : classe,module(le designer s'en occupe )...

    Le namespace (voir page de proprietes du projet) est par defaut general le meme que le nom du projet...exemple "WpfAppButton"...
    Si tu rajoutes un namespace different -par exemple "Decorator" dans ton fichier de class.vb le namespace reel sera alors "WpfApp.Decorateur"

    exemple code avec 2 class dans un projet Application:

    code xaml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:lib="clr-namespace:WpfLibImageButton;assembly=WpfLibImageButton"
        xmlns:local1="clr-namespace:WpfAppButton"
        xmlns:local2="clr-namespace:WpfAppButton.Decorateur"
            Title="MainWindow" Height="500" Width="600">
        <Window.Resources>
            <local1:ClassExemple1 x:Key="ex1"></local1:ClassExemple1>
            <local2:ClassExemple2 x:Key="ex2"></local2:ClassExemple2>
        </Window.Resources>
        <StackPanel >
            <TextBlock 
               x:Name="tb1"
               Text="{Binding Source={StaticResource ex1},Path=NewProperty}">
     
            </TextBlock>
            <TextBlock 
               x:Name="tb2"
               Text="{Binding Source={StaticResource ex2},Path=NewProperty}">
     
            </TextBlock>
     
        </StackPanel>
    </Window>
    code .vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
     
    Class MainWindow
        'meme dans l'intellisense ce bide intervient a moins de declarer
        'un  explicite :Imports WpfAppButton.Decorateur  ...!!!
        Private ex1 As ClassExemple1
        Private ex2 As Decorateur.ClassExemple2
     
     
    End Class
     
    'exemple de class non decore(namespace par defaut celui de ce projet)
     
    Public Class ClassExemple1
        Private newPropertyValue As String = "Class Non Decore"
        Public Property NewProperty() As String
            Get
                Return newPropertyValue
            End Get
            Set(ByVal value As String)
                newPropertyValue = value
            End Set
        End Property
     
    End Class
     
     
    'exemple de class decore avec un Namespace 
    Namespace Decorateur
        Public Class ClassExemple2
            Private newPropertyValue As String = "Class Decore"
            Public Property NewProperty() As String
                Get
                    Return newPropertyValue
                End Get
                Set(ByVal value As String)
                    newPropertyValue = value
                End Set
            End Property
     
     
        End Class
    End Namespace

    Moralite :
    - supprime ce namespace "Decorator" dans ton class ImageButton dans ton projet mettons "LibImageButton"......tout le reste de ton code est bon...

    Si jamais tu veux gardes ce fameux namespace ouvre tes 2 yeux bien grands en tapant xmlns:local=" dans l'intellisense xaml du form Win.

    Tu auras le choix entre 2 references dans le combo deroulant de VS:
    1er : "clr-namespace:LibImageButton;assembly=LibImageButton"
    2eme :"clr-namespace:WpfLibImageButton.Decorator;assembly=WpfLibImageButton"

    Comme illustre dans l'exemple Application donne(c'est valable pour des projets dll) c'est le 2eme choix qu'il faut retenir a cause du decorator...

    Le generic.xaml est parfait...
    bon code....

  19. #19
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    rebonjour
    Oups!
    lire ceci (erreur de frappe malencontreuse s'agissant d'un meme projet lib):

    2eme :"clr-namespace:LibImageButton.Decorator;assembly=LibImageButton"

    bon soiree...............

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Merci MABROUKI, en effet le problème venait du namespace, lorsque je l'ai enlevé de ImageButton.vb mes problèmes ont disparus.
    Merci Tomlev aussi pour ton aide.

    J'ai une dernière question, les images ne s'affichent pas exactement au même endroit que je le vois sur l'éditeur xaml lorsque je debug le programme. En effet, j'essaye de positionner des images en haut à droite qui sont descendues d'environ 20 pixels peut-être à chaque fois que le programme est lancé. Elles sont pourtant toujours au bon endroit sur l'éditeur visuel.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Bouton avec une image : n'envoie pas la commande espérée
    Par lcoulon dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 12/07/2011, 21h40
  2. Bouton avec une image
    Par gassisprog dans le forum Visio
    Réponses: 4
    Dernier message: 01/04/2008, 10h48
  3. Remplir un Bouton avec une Image
    Par vandrie dans le forum IHM
    Réponses: 1
    Dernier message: 15/10/2007, 05h30
  4. Faire un bouton avec une image ?
    Par blanchonvincent dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 29/04/2007, 13h14
  5. [Bouton avec une image]
    Par swayvill dans le forum Java ME
    Réponses: 1
    Dernier message: 29/09/2006, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo