Hay un error en Windows Forms que hace que un formulario desaparezca de la colección Application.OpenForms. Esto sucederá cuando asigne la propiedad ShowInTaskbar, FormBorderStyle, ControlBox, Min/MaximizedBox, RightToLeftLayout, HelpButton, Opacity, TransparencyKey, ShowIcon o MdiParent después de que se haya creado la ventana. Estas propiedades son especiales porque se especifican como indicadores de estilo en la llamada nativa CreateWindowEx(). Esta forma ejemplo muestra el error:
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 deben llamar CreateWindowEx() de nuevo para hacer que la propiedad efectiva cambiado, pasando por diferentes indicadores de estilo. La destrucción de la ventana original primero tiene efectos secundarios más allá del parpadeo muy notable, uno de ellos es que la clase Application pierde la pista de la forma ya que ve desaparecer la ventana. Con el error que no lo vuelve a agregar cuando se crea la nueva ventana. Evite el error estableciendo la propiedad solo en el constructor, el código que se ejecuta antes de que se llame a CreateWindowEx(), y en ningún caso a los controladores.
En general, evite confiar en OpenForms debido a este error. Proporcione a la clase que necesita mostrar el cuadro de mensaje una referencia a la instancia de formulario a través de su constructor. MessageBox generalmente descubre una ventana padre por sí mismo correctamente por cierto, seleccionará la ventana activa y eso es correcto el 99% del tiempo. Si necesita llamar a BeginInvoke() desde un hilo de trabajo, asegúrese de copiar SynchronizationContext.Current en su constructor y llame a su método Post() más adelante. Garantiza que su biblioteca también funcionará con otras bibliotecas de clases de GUI.
Proporcione más información. – SLaks
Si consulto Application.OpenForms.Count en form-load, me lo muestra 1. Algo extraño con su aplicación, necesita proporcionar más detalles sobre cómo reproducir el problema. –
Mi aplicación tiene un formulario principal. Aunque tengo el formulario abierto en el momento en que se ejecuta este código, devuelve 0. Gracias Albin, SLaks – Ananth