C# Nouvelle forme jamais obtient le focus
J'ai essayé d'écrire une petite application avec sa propre option de windows. Lorsque j'essaie de lancer la fenêtre, je peux ne semblent jamais pour définir le focus sur le nouveau formulaire. Ce n'est pas un formulaire mdi, mais simplement un nouveau formulaire que j'ai créé lorsqu'un utilisateur sélectionne une option du menu. Il convient de noter que la Forme.Le Show est de retour false, ce qui signifie que le nouveau formulaire est de ne jamais recevoir le focus.
J'ai essayé plusieurs méthodes pour charger le formulaire et tous ont échoué:
De L'Appel De La Forme:
ServerForm SF = new ServerForm(ref DataLoader, false);
SF.Show();
SF.Focus();
//Fails
À l'intérieur de la forme elle-même:
this.Show();
this.BringToFront();
this.Activate();
this.TopMost = true;
//Fails
Paramètre de Forme de sélection:
this.SetStyle(System.Windows.Forms.ControlStyles.Selectable, true);
...
ServerForm SF = new ServerForm(ref DataLoader, false);
SF.Show();
SF.Focus();
//Fails
L'aide d'une Vieille API:
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int ShowWindow(IntPtr handle, int nCmdShow);
ServerForm SF = new ServerForm(ref DataLoader, false);
ShowWindow(SF.Handle, 3);
SF.Show();
SF.Focus();
//Fails
Passant Parent
ServerForm SF = new ServerForm(ref DataLoader, false);
SF.Show(this);
SF.Focus();
//Fails
Dans tous ces cas, le formulaire s'affichera, mais la forme qui a donné naissance à toujours avoir le focus sur le nouveau formulaire. Cela se produit même lorsque je désactive l'ancienne forme avant que je créer le nouveau formulaire.
Des suggestions?
Vous devez vous connecter pour publier un commentaire.
C'est parce que
Form.canFocus()
est faux lors du chargement du formulaire. UtilisationForm.Activate()
surForm.Shown
événement. C'est tout.Ensemble
TopMost
forme de propriété sur true. Puisdans le programme.cs:
dans formLogin:
J'ai résolu avec cela (merci à @Joel Coehoorn):
Rappelez-vous qu'il n'existe qu'un seul thread d'interface utilisateur autorisé dans une application winforms.
Êtes-vous de manipuler quoi que ce soit sur le formulaire parent après votre appel à
Form.Show()
? Cettepeut causer le formulaire parent pour être porté à nouveau.
Supprimer tout ce que vous avez utilisé pour essayer de se concentrer, activer le formulaire et appuyer sur l'appel à
Form.Show()
. Cela devrait être suffisant pour charger le formulaire, et de se concentrer sur elle. Si quoi que ce soit, dans votre élément de menu handler. Commentez tout suite à votre appel àShow()
et voir si cela fonctionne. Travail en arrière pour voir ce qui a causé votre formulaire parent pour être recentré.Cela semble fonctionner. J'ai d'abord créer le nouveau formulaire:
Puis dans le constructeur de la nouvelle forme je ne les suivants:
Apparemment il y a une sorte de derrière la scène de la différence entre la Forme.Spectacle et de la Forme.ShowDialog. Pas quites sûr de ce qu'il est, je ne peux que penser qu'il a à faire avec réglage de la parent d'une certaine manière. L'ajout de code après l'appel à construire la fonction ne semble pas donner de retour focus sur le formulaire parent. Qui il ne devrait pas.
Essayer d'appeler
ShowDialog(this)
. Il a aidé dans mon cas, quand j'ai connu le même problème.Avez-vous essayé le réglage de l'fenêtre parent dans
Formulaire.Show()
?E. g.:
Edit:
Il se passe quelque chose qui n'est pas dans votre question. Est votre fenêtre propriétaire d'une fenêtre de niveau Supérieur?