Pregunta

I tiene un problema con la modalidad de las formas en C # .NET. Digamos que tengo forma principal # 0 (ver la imagen de abajo). Esta forma representa formulario de solicitud principal, donde el usuario puede realizar varias operaciones. Sin embargo, de vez en cuando, hay una necesidad de forma no modal adicional abierta para realizar tareas adicionales que apoyan la funcionalidad principal de la aplicación. Digamos que esta es la forma # 1 en la imagen. En esta # 1 forma que podría ser abierto pocas formas modales adicionales en la parte superior de la otra (forma # 2 en la imagen), y al final, hay un diálogo de progreso que muestra un progreso de la operación de largo y de estado, lo que podría tomar de pocos minutos hasta algunas horas. El problema es que la forma principal # 0 no responde hasta que cierre todas las formas modales (nº 2 en la imagen). Necesito que la forma principal # 0 entraría en funcionamiento en esta situación. Sin embargo, si abre un formulario no modal en forma # 2, se puede operar tanto con forma modal # 2 y forma no modal de nueva creación. Necesito el mismo comportamiento entre la forma principal # 0 y # 1 formar con todos sus formularios secundarios. ¿Es posible? O estoy haciendo algo mal? Tal vez hay algún tipo de solución, yo realmente no les gusta cambiar todas las llamadas ShowDialog to show ...

imagen http://img225.imageshack.us/img225/1075/modalnonmodalproblem. png

¿Fue útil?

Solución

formas modales hacen exactamente lo que significa "modal", se desactivan todas las demás ventanas de la aplicación. Eso es bastante importante, el programa se encuentra en un estado un tanto peligrosa. Tienes un trozo de código que está esperando el cuadro de diálogo para cerrar. Muy mal las cosas podrían suceder si esas otras ventanas no eran discapacitados. Al igual que el usuario podría iniciar el diálogo modal de nuevo, ahora su código está anidado en dos ocasiones. O podría cerrar la ventana propietaria del cuadro de diálogo, ya que de repente desaparece.

Estos son el tipo exacto de los problemas que había corrido en si se llama Application.DoEvents () dentro de un bucle. Que es una manera de obtener una forma modal a comportarse sin desactivar otras ventanas. Por ejemplo:

    Form2 mDialog;

    private void button1_Click(object sender, EventArgs e) {
        mDialog = new Form2();
        mDialog.FormClosed += (o, ea) => mDialog = null;
        mDialog.Show(this);
        while (mDialog != null) Application.DoEvents();
    }

Este es peligroso .

Sin duda, es mejor utilizar formas modales de la forma en que fueron diseñados para mantenerse fuera de problemas. Si no desea que un formulario modal entonces simplemente no lo hacen modal, utilice el método Show (). Suscribirse a su evento FormClosing saber que está a punto de cerrar:

    private void button1_Click(object sender, EventArgs e) {
        var frm = new Form2();
        frm.FormClosing += new FormClosingEventHandler(frm_FormClosing);
        frm.Show();
    }

    void frm_FormClosing(object sender, FormClosingEventArgs e) {
        var frm = sender as Form2;
        // Do something with <frm>
        //...
    }

Otros consejos

La primera cosa que viene a la mente sería algo como esto. Se podría desactivar forma 1 cuando lanzar forma 2 y luego tener la forma 1 mango cerrado el caso de la segunda forma para volver a habilitar en sí. Usted no se podía abrir modal 2 usando el diálogo espectáculo.

Ahora, tenga en cuenta, desde el punto de vista del usuario esto va a ser bastante engorroso, lo podría hacer en realizar una aplicación MDI para obtener todas las ventanas en el interior de un único contenedor.

Su forma principal no será sensible hasta los cuadros de diálogo modales que están en el mismo espacio de proceso están cerrados. No hay trabajo en torno a eso.

A mi me parece que te vendría bien una aplicación MDI Ajuste de la fórmula # 0 IsMdiContainer propiedad en true.

A continuación, se podría hacer algo por igual:

public partial class Form0 {
    public Form0 {
        InitializeComponent();
        this.IsMdiContainer = true; // This will allow the Form #0 to be responsive while other forms are opened.
    }

    private void button1_Click(object sender, EventArgs e) {
        Form1 newForm1 = new Form1();
        newForm1.Parent = this;
        newForm1.Show();
    }
}

Uso de la ShowDialog () como ha afirmado en su pregunta hará que todas las formas modal = true .

Por definición, una forma modal es:

  

Cuando se muestra una forma modal, no de entrada (teclado o un clic del ratón) puede ocurrir con excepción de los objetos en la forma modal. El programa debe ocultar o cerrar una forma modal (por lo general en respuesta a alguna acción del usuario) antes de la entrada a otra forma puede ocurrir. Formas que se muestran de forma modal se utilizan normalmente como cuadros de diálogo en una aplicación.

     

Puede utilizar esta propiedad [( modal)] para determinar si una forma que ha obtenido a partir de un método o propiedad se ha mostrado de forma modal.

Por lo tanto, una forma modal deberá utilizarse únicamente en caso de requerir asistencia inmediata / interacción por parte del usuario. El uso de formas modales de lo contrario hace creer que estás quizás ejecutando en una dirección equivocada.

Si no desea que su principal forma para ser un contenedor de MDI, entonces tal vez el uso de múltiples hilos es una solución a través de un simple clase BackgroundWorker es la clave de lo que quiere lograr. Por lo tanto, me parece un olor diseño ...

  • ¿Qué es lo que quiere hacer, aparte de hacer que su principal forma de respuesta, etc.
  • ¿Qué es lo que tiene que hacer?

Al explicar lo que tiene que hacer, que podría ser capaz de guiarlo por completo a la derecha, o al menos tal vez mejor, dirección.

En realidad, la respuesta es muy simple. Trate

newForm.showDialog();

Esto abrirá una nueva forma, mientras que el uno de los padres es inaccesible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top