Il existe un bogue dans Windows Forms qui fait disparaître un formulaire de la collection Application.OpenForms. Cela se produit lorsque vous affectez la propriété ShowInTaskbar, FormBorderStyle, ControlBox, Min/MaximizedBox, RightToLeftLayout, HelpButton, Opacité, TransparencyKey, ShowIcon ou MdiParent après la fenêtre a été créée. Ces propriétés sont spéciales en ce sens qu'elles sont spécifiées en tant qu'indicateurs de style dans l'appel natif CreateWindowEx(). Ce formulaire exemple illustre le bogue:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
button1.Click += button1_Click;
}
private void button1_Click(object sender, EventArgs e) {
Console.WriteLine(Application.OpenForms.Count);
this.ShowInTaskbar = !this.ShowInTaskbar;
Console.WriteLine(Application.OpenForms.Count);
}
}
Windows Forms doivent appeler CreateWindowEx() pour rendre la propriété effective changé, passant des drapeaux de style différents. Détruire la fenêtre d'origine a d'abord des effets secondaires au-delà du scintillement très perceptible, l'un d'eux est que la classe Application perd la trace du formulaire car il voit la fenêtre disparaître. Avec le bug qu'il ne rajoute pas quand la nouvelle fenêtre est créée. Évitez le bogue en définissant la propriété uniquement dans le constructeur, le code qui s'exécute avant l'appel de CreateWindowEx(), pas dans les gestionnaires d'événements.
En général, évitez de vous fier à OpenForms à cause de ce bogue. Donnez à la classe qui doit afficher la boîte de message une référence à l'instance de formulaire via son constructeur. MessageBox trouve généralement une fenêtre parent par elle-même correctement, il choisira la fenêtre active et c'est correct 99% du temps. Si vous en avez besoin pour appeler BeginInvoke() à partir d'un thread de travail, veillez à copier SynchronizationContext.Current dans votre constructeur et appelez sa méthode Post() plus tard. Garantit que votre bibliothèque fonctionnera également avec d'autres bibliothèques de classes d'interface graphique.
Veuillez fournir plus d'informations. – SLaks
Si je vérifie Application.OpenForms.Count dans le formulaire-charge il me montre 1. Quelque chose est étrange avec votre application, vous devez fournir plus de détails sur la façon de reproduire le problème. –
Mon application a une forme principale.Même si j'ai le formulaire ouvert au moment où ce code est exécuté, il renvoie 0. Merci Albin, SLaks – Ananth