2008-12-13 8 views
0

Sur mon formulaire principal, il y a une autre fenêtre (flottante). Cette fenêtre flottante fonctionne en quelque sorte comme une fenêtre contextuelle dans la mesure où elle se ferme lorsque l'utilisateur clique ailleurs à l'extérieur de cette fenêtre. Ceci est géré par l'événement Deactivate. Mais ce que je veux faire est, si l'utilisateur clique sur un contrôle différent (disons un bouton), je veux à la fois fermer cette fenêtre flottante et ensuite activer ce bouton en un seul clic. Actuellement, l'utilisateur doit cliquer deux fois (un pour désactiver la fenêtre et une fois de plus pour activer le bouton désiré). Existe-t-il un moyen de le faire en un seul clic?Comment faire deux choses en un clic dans Windows Form

Répondre

0

J'avais une solution légèrement hacky. Dans votre événement Deactivate, envoyez un autre événement personnalisé à votre formulaire principal. Ensuite, lorsque votre formulaire principal gère l'événement personnalisé, énumérez-le via votre contrôle (this.Controls) et localisez le contrôle sous la souris en vérifiant tout leur lien puis appelez Focus(). Vous pourriez avoir besoin de trier par celui avec la plus petite surface, ou vous pouvez avoir une liste séparée de contrôle "focus-able" comme bouton juste à cet effet. Une autre méthode consiste à basculer le focus sur votre formulaire principal immédiatement après OnMouseLeave de la fenêtre flottante ou sur OnMouseHover de votre fenêtre principale, tout en conservant les fenêtres flottantes en haut, sans aucun focus. Gérez la souris globale de votre formulaire principal et fermez la fenêtre flottante d'ici là.

Ce ne sont que des théories, non testées.

2
foreach(Control c in parentForm.Controls) 
{ 
    c.Click += delegate(object sender, EventArgs e) 
       { 
        if(floatyWindow != null && floatyWindow.IsFloating) 
        { 
         floatyWindow.Close(); 
        } 
       }; 
} 

Puis ajoutez vos gestionnaires comme d'habitude. Ce gestionnaire supplémentaire peut fermer la fenêtre flottante. Assurez-vous que la fenêtre floaty n'est pas une boîte de dialogue car elle ne permet pas de cliquer sur les contrôles de votre fiche parent.

+0

Vous étiez un poil plus rapide que moi ... bonne solution – JoshBerke

0

J'ai eu un problème comme celui-ci une fois aussi, quand un client voulait des fenêtres "flottantes" partout dans l'application. J'ai utilisé utilisé une approche similaire à celle décrite dans cet article:

http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/article.asp

Exemple de code

ici:

http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/Popup_Form_Demonstration.asp

En prolongeant ce un peu que nous avons créé les fenêtres « vaporeux » similaires à ceux que VS utilise lorsque vous obtenez une erreur d'exécution pendant le débogage du code. À tout le moins, la lecture du code peut vous donner un aperçu, cependant, la réponse querelleuse peut être la solution la plus simple.

+0

http://tinyurl.com –

Questions connexes