Application.OpenForms.Count = 0 toujours
J'ai cette situation.
Application.OpenForms ne pas retourner le bon résultat. ie Application.OpenForms.Count = 0
toujours..
But d'obtenir la forme est d'obtenir le propriétaire de la Forme, afin que je puisse passer le propriétaire en tant que paramètre de la MessageBox.Show()
fonction.
source d'informationauteur Ananth
Vous devez vous connecter pour publier un commentaire.
Il ya un bug dans Windows Forms qui rend un formulaire de disparaître de l'Application.OpenForms collection. Cela se produira lorsque vous affectez la ShowInTaskbar, FormBorderStyle, ControlBox, Min/MaximizedBox, RightToLeftLayout, HelpButton, l'Opacité, la TransparencyKey, ShowIcon ou propriété MdiParent après la fenêtre a été créé. Ces propriétés sont particulières en ce qu'elles sont spécifiées comme des indicateurs de style amérindien, CreateWindowEx (). Ce modèle démontre le bug:
Windows Forms doit appeler CreateWindowEx() à nouveau pour faire le changement de propriété effective, en passant les différents indicateurs de style. Détruire l'original de la fenêtre a des effets secondaires au-delà de la très scintillement notable, l'un d'eux est que la classe d'Application perd la trace de la forme, car il voit de la fenêtre de disparaître. Avec le bug qu'il n'ajoute pas en arrière quand la nouvelle fenêtre est créée. Eviter le bug en définissant la propriété que dans le constructeur, le code qui s'exécute avant CreateWindowEx() est appelée, non pas dans des gestionnaires d'événements.
En général, évitez les OpenForms en raison de ce bug. Donner à la classe qui doit afficher la boîte de message une référence à l'instance de formulaire via son constructeur. MessageBox généralement sur les chiffres d'une fenêtre parent par lui-même correctement btw, il va choisir la fenêtre active et c'est correct 99% du temps. Si vous en avez besoin à appeler BeginInvoke() à partir d'un thread de travail alors assurez-vous de copier SynchronizationContext.Actuelle dans votre constructeur et appeler sa méthode Post() plus tard. Assure votre bibliothèque va également travailler avec d'autres GUI bibliothèques de classe.
J'ai eu ce problème lorsque j'ai utilisé ShowInTaskBar = true. Je l'ai résolu en utilisant l'API de windows au lieu de le .Net des propriétés. Application.OpenForms est restée intacte.
Je ne sais pas si il fonctionne comme une solution de contournement générale à l'aide de SetWindowLong pour modifier les propriétés, mais il fonctionne pour ShowInTaskBar = true.