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 :

[WPF 3.5]CustomControl avec Click et DoubleClick Event


Sujet :

Windows Presentation Foundation

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Par défaut [WPF 3.5]CustomControl avec Click et DoubleClick Event
    Bonjour à tous,

    Je viens demander votre aide car j'ai un problème, je souhaite créer un CustomControl qui ait l'event Click et DoubleClick, j'ai donc procédé de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void MyControl_MouseDown(object sender, MouseButtonEventArgs e)
            {
                if(e.ChangedButton == MouseButton.Left)
                {
                    if(e.ClickCount == 1)
                        MessageBox.Show("Click");
                    if(e.ClickCount == 2)
                        MessageBox.Show("DoubleClick");
                }
            }
    Cependant, je n'obtient toujours que l'evnt Click. Est ce que vous auriez une idée pour implémenter cela svp?

    J'ai fait une recherche sur le forum, mais je n'ai pas trouvé, après j'ai peut être mal cherché .

    Merci de vos réponse et bonne journée

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    ecoute solit je comprend pas mais dans un custom control tu as le double click
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     public class CustomControl1 : Control
        {
            static CustomControl1()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
            }
            protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
            {
                base.OnMouseDoubleClick(e);
            }
        }

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Par défaut
    Oui il y a le double clique, je l'ai trouvé après . Cependant, le problème persiste.

    Si j'utilise le MouseDown pour gérer le Click, le double click n'est jamais appelé.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    mais pourquoi tu veux le gerrer dans le mouse douwn ????

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 97
    Par défaut
    Hello,
    Je ne veux pas parler à la place d'Anthares, mais j'imagine que s'il utilise MouseDown c'est parce qu'il ne trouve pas d'évènement OnMouseClick.
    Or il a besoin de l'évènement click et de l'évènement double click.
    Enfin si j'ai bien compris.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    certes mais ce deux events existent deja dans le customcontrol

  7. #7
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 97
    Par défaut
    J'ai créé un CustomControl.
    Je suis ok pour le doublie-click ; il y a bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
    Mais pour le simple clic, quelle méthode surcharges-tu?
    Je ne vois aucun "OnMouseClick" ou quelque chose qui s'en rapproche. Je ne vois que le MouseDown.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    tu peux utilser ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e)
            {
                base.OnPreviewMouseLeftButtonDown(e);
            }
    en preview ou pas

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Par défaut
    Comme l'a bien dis Cecile5, je ne trouvais pas de OnMouseClick, du coup, j'utilisais le MouseDown.

    Citation Envoyé par ikeas Voir le message
    tu peux utilser ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e)
            {
                base.OnPreviewMouseLeftButtonDown(e);
            }
    en preview ou pas
    J'y ai déjà pensé Ikeas, mais le problème reste le même, si je gère le click simple dedans, seul celui-ci est remonté.

    J'ai trouvé une solution, celle-ci n'est peut-être pas très élégante, mais elle fonctionne: j'utilise une classe MouseClickEventManager qui est défini de la façon suivante

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    public class MouseClickEventManager
        {
            public event MouseButtonEventHandler Click;
            public event MouseButtonEventHandler DoubleClick;
     
            /// <summary>
            /// Gets or sets a value indicating whether this <see cref="MouseClickEventManager "/> is clicked.
            /// </summary>
            /// <value><c>true</c> if clicked; otherwise, <c>false</c>.</value>
            private bool Clicked { get; set; }
     
            /// <summary>
            /// Gets or sets the control.
            /// </summary>
            /// <value>The control.</value>
            public UIElement UIElement { get; set; }
     
            /// <summary>
            /// Gets or sets the timeout.
            /// </summary>
            /// <value>The timeout.</value>
            public int Timeout { get; set; }
     
            /// <summary>
            /// Initializes a new instance of the <see cref="MouseClickEventManager "/> class.
            /// </summary>
            /// <param name="control">The control.</param>
            public MouseClickEventManager (UIElement uiElement, int timeout)
            {
                Clicked = false;
                UIElement = uiElement;
                Timeout = timeout;
            }
     
            /// <summary>
            /// Handles the click.
            /// </summary>
            /// <param name="sender">The sender.</param>
            /// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>
            public void HandleClick(object sender, MouseButtonEventArgs e)
            {
                lock (this)
                {
                    if (Clicked)
                    {
                        Clicked = false;
                        OnDoubleClick(sender, e);
                    }
                    else
                    {
                        Clicked = true;
                        ParameterizedThreadStart threadStart = new ParameterizedThreadStart(ResetThread);
                        Thread thread = new Thread(threadStart);
                        thread.Start(e);
                    }
                }
            }
     
            /// <summary>
            /// Resets the clicked flag after timeout.
            /// </summary>
            /// <param name="state">The state.</param>
            private void ResetThread(object state)
            {
                Thread.Sleep(Timeout);
     
                lock (this)
                {
                    if (Clicked)
                    {
                        Clicked = false;
                        OnClick(this, (MouseButtonEventArgs)state);
                    }
                }
            }
     
            /// <summary>
            /// Called when click occure.
            /// </summary>
            /// <param name="sender">The sender.</param>
            /// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>
            private void OnClick(object sender, MouseButtonEventArgs e)
            {
                MouseButtonEventHandler handler = Click;
     
                if (handler != null)
                    UIElement.Dispatcher.BeginInvoke(handler, sender, e);
            }
     
            /// <summary>
            /// Called when [double click].
            /// </summary>
            /// <param name="sender">The sender.</param>
            /// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>
            private void OnDoubleClick(object sender, MouseButtonEventArgs e)
            {
                MouseButtonEventHandler handler = DoubleClick;
     
                if (handler != null)
                    handler(sender, e);
            }
        }
    Il y a un temps de réponse non négligeable, mais ça marche
    J'espère que cela aidera les gens qui essaie de faire pareil. Si vous avez une meilleure solution, je suis preneur

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    file moi une maquette sous forme de projet de l'ancien problème
    je regarde et je te trouve quelque chose

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. avec click sur un lien, ouvrir une image dans une page html
    Par Bydouille dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 17/10/2007, 20h40
  2. problème avec Click droit de la souris
    Par patou41000 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 22/05/2007, 10h32
  3. Detection de contour avec click de souris
    Par fAdoua123 dans le forum Interfaces Graphiques en Java
    Réponses: 15
    Dernier message: 24/04/2007, 00h31
  4. Alternative au déploiement avec Click-once
    Par vladvad dans le forum Visual Studio
    Réponses: 3
    Dernier message: 08/03/2007, 01h14
  5. selection image avec click
    Par Tail dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/11/2006, 10h05

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