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 :

fenêtre qui disparaît lorsque l'on clique ailleurs que sur elle


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Thor Tillas
    Inscrit en
    Octobre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 113
    Par défaut fenêtre qui disparaît lorsque l'on clique ailleurs que sur elle
    Bonjour le monde,

    Donc, le but c'est d'avoir un bouton qui ouvre une "fenêtre popup" qui sera fermée lors d'un click en dehors de cette dernière.

    Pour information, le contenu de la fenêtre est un Control qui contient un treeview de radio button...

    J'ai tenté de l'implémenter avec un menu + MenuItem dont la propriété StayOpenOnClick est mise à "true" mais rien à faire... Dès que je clique sur le menu ou sur un enfant du treeview tout se ferme.
    La seule chose que j'ai réussi à faire c'est à empêcher la fermeture lors d'un clique sur le rond du radio button en mettant un "e.handle = true" dans le handler MouseDown du radio button.

    Voici le code que j'utilise pour créer mon menu...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <StackPanel Orientation="Horizontal">
      <Menu>
        <MenuItem Header="Filter" StaysOpenOnClick="True">
          <libCont:NavigationFilterControl Name="m_navigationFilterControl"/>
        </MenuItem>
      </Menu>
    </StackPanel>
    J'ai bien pensé à créer une vrai fenêtre sans bord, mais comme je sais pas trop comment je pourrais ensuite récupérer un clic en dehors de la dite fenêtre...

    J'en suis donc là. Soit je trouve un moyen pour empêcher le menu de se fermer, soit je deviens capable de récupérer le clic en dehors d'une fenêtre donnée.
    Quelqu'un a une idée, un conseil ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Citation Envoyé par Thor Tillas Voir le message
    soit je deviens capable de récupérer le clic en dehors d'une fenêtre donnée.
    euh CaptureMouse ne permet pas de faire ça justement ?

    http://msdn.microsoft.com/fr-fr/libr...se(en-us).aspx

    (je ne suis pas trop sûr de ce que j'avance, quelqu'un confirmera ou infirmera sans doute)

  3. #3
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    En effet, je pense qu'il faut que tu gères cela avec la méthode CaptureMouse

  4. #4
    Membre confirmé Avatar de Thor Tillas
    Inscrit en
    Octobre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 113
    Par défaut
    J'y avais pas pensé... je vais voir ca de ce pas.

    Je vous tiens au courant !

    Merci.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Ya quelques événements genre LostFocus qui peuvent être intéressant. Mais après test rapide, je constate que tu fermes aussi ta fenêtre en donnant le focus a un élément de la fenêtre

    Peut être à creuser si tu n'as plus d'autre idée.

  6. #6
    Membre confirmé Avatar de Thor Tillas
    Inscrit en
    Octobre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 113
    Par défaut
    Donc... J'ai créé une fenêtre "Filter" qui contient mon treeview. J'ai créé un bouton qui lors d'un clic, crée puis ouvre la fenêtre "filter" en topmost.

    Mon problème c'est que le CaptureMouse() semble ne fonctionner que dans la fenêtre "filter". Si je clique en dehors je n'ai pas de MouseDown qui se lève.
    En plus, avec le CaptureMouse, je n'arrive plus à ouvrir mon treeview. J'ai découvert que Mouse.Capture(this, MouseMode.SubTree) me permettait de combler cette lacune.

    Je pensais utiliser le LostMouseCapture qui est levé la première fois que je clique en dehors de mon application (donc de mes deux fenêtre). Si je clique sur ma fenêtre parente rien a faire il se lève pas. Par contre si je veux ouvrir mon treeview là, il se lève. A chaque fois que je clique sur un enfant du treeview, il se lève, puis si je clique sur une autre application, il ne se lève plus.


    Est ce que j'ai manqué quelque chose ? Comment faire pour récupérer un event mousedown à l'extérieur de ma fenêtre "Filter"?

    Code behind de la fenêtre "Filter"

    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
     
    public Window2()
        {
          InitializeComponent();
          Topmost = true;
          Loaded += new RoutedEventHandler(Window2_Loaded);
        }
     
        void Window2_Loaded(object sender, RoutedEventArgs e)
        {
          Mouse.Capture(this, CaptureMode.SubTree);
          LostMouseCapture += new MouseEventHandler(Window2_LostMouseCapture);
          MouseDown += new MouseButtonEventHandler(Window2_MouseDown);
        }
     
        void Window2_MouseDown(object sender, MouseButtonEventArgs e)
        {
          // do stuff
          System.Diagnostics.Debug.Write("MouseDown\n");
        }
     
        void Window2_LostMouseCapture(object sender, MouseEventArgs e)
        {
          // do stuff
          System.Diagnostics.Debug.Write("LostMouseCapture\n");
        }
    P.S. @Nalfeim : j'avais pas vu ton post... mais je suis arrivé aux meme conclusion

  7. #7
    Membre confirmé Avatar de Thor Tillas
    Inscrit en
    Octobre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 113
    Par défaut
    Petite découverte...

    Il existe un évenement "Attaché" (je sais pas trop la différence avec les événements normaux... mais apparemment on peut s'enregistrer dessus qu'avec des méthodes Add*evenement*) nommé PreviewMouseDownOutsideCapturedElementEvent.

    Cet événement est envoyé à l'élément défini dans le Mouse.Capture() lorsque le clic est en dehors de lui.

    Mon problème : lorsque je clique sur le treeview pour l'étendre ou pour cocher une case... je perd le Mouse.Capture. Et donc je ne suis plus notifié lors d'un clic hors de ma fenêtre.
    j'ai tenté de faire un Mouse.Capture à chaque fois que je recois un LostMouseCapture, mais pas de bol, je peux plus cocher mes cases.

    De plus la bordure est considérée comme n'appartenant pas à la fenêtre... donc bof.

    Des idées pour améliorer ca ?


    je vous met le code :
    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
     
    public Window2()
        {
          InitializeComponent();
          Topmost = true;
          Loaded += new RoutedEventHandler(Window2_Loaded);
     
        }
     
        void Window2_Loaded(object sender, RoutedEventArgs e)
        {
          Mouse.Capture(this, CaptureMode.SubTree);
          Mouse.AddPreviewMouseDownOutsideCapturedElementHandler(this, Mouse_OutsideClick);
          //CaptureMouse();
          LostMouseCapture += new MouseEventHandler(Window2_LostMouseCapture);
          MouseDown += new MouseButtonEventHandler(Window2_MouseDown);
        }
     
        void Mouse_OutsideClick(object sender, MouseButtonEventArgs e)
        {
          // do stuff
          System.Diagnostics.Debug.Write("OutsideClick\n");
          this.Close();
        }
        void Window2_MouseDown(object sender, MouseButtonEventArgs e)
        {
          // do stuff
          System.Diagnostics.Debug.Write("MouseDown\n");
        }
     
        void Window2_LostMouseCapture(object sender, MouseEventArgs e)
        {
          // do stuff
          System.Diagnostics.Debug.Write("LostMouseCapture\n");
          Mouse.Capture(this, CaptureMode.SubTree);
        }

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/01/2012, 18h43
  2. fenêtre qui disparaît trop vite
    Par minerva dans le forum Windows Forms
    Réponses: 6
    Dernier message: 18/10/2010, 12h15
  3. Comment effacer le contenu dun label lorsque l'on clique ailleurs ?
    Par kvndevils dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/04/2008, 13h27
  4. [XP] Fichiers systèmes ailleurs que sur C:\
    Par Trap D dans le forum Windows XP
    Réponses: 3
    Dernier message: 06/08/2007, 14h54
  5. Installation Delphi 2005 personnel ailleurs que sur C
    Par Mechanik dans le forum Delphi
    Réponses: 1
    Dernier message: 21/07/2006, 14h18

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