visual superior que puede nivel net mostrar modal formulario form diálogo cuadro como cerrar c# .net winforms

c# - superior - ¿Puede un formulario indicar si hay ventanas modales abiertas?



showdialog(); (5)

Resumen largo: abrir un formulario modal es la ejecución de bloques en el formulario principal, siempre y cuando la ventana modal esté abierta, por lo que su formulario principal nunca podrá verificar si abrió formularios modales hasta que se haya cerrado el formulario modal . En otras palabras, su pregunta se basa en un malentendido sobre cómo funcionan las formas modales, por lo que es totalmente discutible.

Por lo que vale, es posible decir si hay formularios modales abiertos:

foreach (Form f in Application.OpenForms) { if (f.Modal) { // do stuff } }

¿Cómo, estando dentro del formulario principal de mi aplicación WinForm puedo saber si hay ventanas / diálogos modales abiertos que pertenecen al formulario principal?


if (this.Visible && !this.CanFocus) { // modal child windows are open }


Quizás puedas usar los eventos para EnterThreadModal y LeaveThreadModal . Aquí hay un ejemplo de cómo puedes hacerlo:

using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace WindowsFormsApplication1 { static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.EnterThreadModal += new EventHandler(Application_EnterThreadModal); Application.LeaveThreadModal += new EventHandler(Application_LeaveThreadModal); Application.Run(new Form1()); } private static void Application_EnterThreadModal(object sender, EventArgs e) { IsModalDialogOpen = true; } private static void Application_LeaveThreadModal(object sender, EventArgs e) { IsModalDialogOpen = false; } public static bool IsModalDialogOpen { get; private set; } } }


Los temporizadores todavía funcionan y disparan eventos. Ejemplo que funciona ... clase parcial pública Form1: Forma {Form2 f2 = new Form2 (); public Form1 () {InitializeComponent (); }

private void timer1_Tick(object sender, EventArgs e) { f2.UpdateData(DateTime.Now.ToString()); if (!f2.Visible) f2.ShowDialog(); } private void button1_Click(object sender, EventArgs e) { f2.ShowDialog(); MessageBox.Show("Done"); } }


Si Google un poco, encontrará que Form.ShowDialog () deshabilita otros formularios para evitar que el usuario ingrese esos formularios del actual. Pero casi todo lo demás (como temporizadores y otros eventos de fuentes externas a la forma mostrada) continúa ejecutándose.