Application.OpenForms.Count Énigme avec les propriétés du formulaire
Vous êtes-vous déjà demandé pourquoi Application.OpenForms.Count renvoie toujours 0 ? Ce problème déroutant survient dans des circonstances spécifiques lors de la modification de certaines propriétés d'un formulaire après sa création.
Comprendre le bug
Windows Forms présente un bug connu qui provoque la disparition d'un formulaire la collection Application.OpenForms si son ShowInTaskbar, FormBorderStyle, ControlBox, Min/MaximizedBox, RightToLeftLayout, HelpButton, Les propriétés Opacity, TransparencyKey, ShowIcon ou MdiParent sont modifiées après la création. Ces propriétés définissent des indicateurs de style dans l'appel natif CreateWindowEx(), obligeant le système à recréer la fenêtre avec le style mis à jour.
Lorsque la fenêtre d'origine est détruite, Application.OpenForms en perd la trace. Cependant, il ne parvient pas à le relire lorsque Windows crée la nouvelle fenêtre.
Éviter le bug
Pour éviter ce bug, définissez les propriétés susmentionnées exclusivement dans le constructeur du formulaire. , avant que Windows n'appelle CreateWindowEx(). Évitez de modifier ces propriétés dans les gestionnaires d'événements ou dans tout code qui s'exécute après la création de la fenêtre.
Alternatives à Application.OpenForms
Étant donné le potentiel de problèmes avec OpenForms, il est conseillé de adopter des approches alternatives. Pensez à fournir le formulaire propriétaire de la boîte de message directement en tant que paramètre dans le constructeur de la classe d'affichage. Dans la plupart des cas, MessageBox peut déterminer automatiquement la fenêtre parent appropriée.
Si vous invoquez des boîtes de message à partir d'un thread de travail, assurez-vous que le SynchronizationContext actuel est transmis dans le constructeur et utilisé pour appeler Post(). Cette approche garantit la compatibilité avec d'autres frameworks GUI.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!