В Windows Forms есть ошибка, из-за которой форма исчезает из коллекции Application.OpenForms.Это произойдет, когда вы назначите свойства ShowInTaskbar, FormBorderStyle, ControlBox, Min / MaximizedBox, RightToLeftLayout, HelpButton, Opacity, TransparencyKey, ShowIcon или MdiParent после после создания окна.Эти свойства отличаются тем, что они указываются как флаги стиля в собственном вызове CreateWindowEx ().Этот образец формы демонстрирует ошибку:
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 должен снова вызвать CreateWindowEx (), чтобы изменение вступило в силу, передавая различные флаги стиля.У уничтожения исходного окна сначала есть побочные эффекты, помимо очень заметного мерцания, одним из них является то, что класс Application теряет форму, так как видит, что окно исчезает.С ошибкой, что он не добавляет его обратно при создании нового окна.Избегайте ошибок, устанавливая свойство только в конструкторе, код, который выполняется до вызова CreateWindowEx (), а не в каких-либо обработчиках событий.
В общем, избегайте полагаться на OpenForms из-за этой ошибки.Дайте классу, который должен отобразить окно сообщения, ссылку на экземпляр формы через его конструктор.MessageBox обычно правильно определяет родительское окно, кстати, оно выберет активное окно, и это правильно в 99% случаев.Если вам нужно вызвать BeginInvoke () из рабочего потока, обязательно скопируйте SynchronizationContext.Current в ваш конструктор и позже вызовите его метод Post ().Гарантирует, что ваша библиотека также будет работать с другими библиотеками классов GUI.