2010-03-06 8 views
5

si ejecuta este fragmento de código (ponerlo en Form1) en una nueva aplicación WinForm fresca con 2 formascómo cambiar "this.ShowInTaskBar" para un "form.ShowDialog()" mientras se mantiene abierto?

private void Form1_Load(object sender, EventArgs e) 
    { 
     Form2 newForm = new Form2(); 
     Button b = new Button(); 
     newForm.Controls.Add(b); 
     b.Click += new EventHandler(click); 
     this.Show(); 
     newForm.ShowDialog(); 

    } 

    private void click(object sender, EventArgs e) 
    { 
     ((Form)((Control)sender).Parent).ShowInTaskbar = false; 
    } 

y se hace clic en el botón en el nuevo formulario (debe ser formulario2), formulario2 se cerrará .

¿Cómo mantenerlo abierto?

Respuesta

0

cómo ... mi ...este es un truco feo

este trabajo

private void Form1_Load(object sender, EventArgs e) 
    { 
     Form2 newForm = new Form2(); 
     Button b = new Button(); 
     newForm.Controls.Add(b); 
     b.Click += new EventHandler(click); 
     newForm.FormClosed += new FormClosedEventHandler(form2_closed); 
     newForm.FormClosing += new FormClosingEventHandler(form2_closing); 
     this.Show(); 
     do 
     { 
      newForm.ShowDialog(); 
     } while (newForm.IsDisposed == false);    
    } 

    private void click(object sender, EventArgs e) 
    { 
     ((Form)((Control)sender).Parent).ShowInTaskbar = !((Form)((Control)sender).Parent).ShowInTaskbar; 
    } 

    private void form2_closed(object sender, FormClosedEventArgs e) 
    { 
     ((Form)sender).Dispose(); 
    } 

    private void form2_closing(object sender, FormClosingEventArgs e) 
    { 
     if (e.CloseReason == CloseReason.None) 
      e.Cancel = true; 
    } 
+0

No, esto es simplemente incorrecto. los formularios modales y los iconos de la barra de tareas no se mezclan. Usa uno u otro, pero no ambos. –

+0

Estoy de acuerdo con usted pero no especifico especificaciones, ojalá fuera alguna vez – Fredou

+0

; el problema no es solo que está violando las convenciones, sino que también se basa en un comportamiento indefinido o con errores. Puede encontrar que esto no funcionará en todas las versiones de Windows, por ejemplo. – overslacked

0

Su pregunta no es muy clara para mí. De todos modos, el formulario newForm se muestra como un cuadro de diálogo modal, lo que significa que impide que el usuario trabaje con el formulario principal hasta que se cierra. Los diálogos modales generalmente tienen algunos botones que los cierran automáticamente y devuelven OK o Cancel al formulario de llamada (como valor de retorno de ShowDialog). Esto se hace usando el DialogResult property, por lo que si esta propiedad está configurada para su botón, esta puede ser una razón por la cual el formulario modal se cierra cuando hace clic en él.

Si desea mostrar más formularios de manera que el usuario pueda trabajar con ambos, deberá usar el cuadro de diálogo no modal. Aquí hay un good overview article on MSDN.

+0

mi pregunta es, cómo mantener una forma que se fija para ser mostrada como un cuadro de diálogo y de sacarlo de la barra de tareas sin tener la forma cerrando automaticamente – Fredou

2

Manténgalo abierto configurando ShowInTaskbar en falso antes de ShowDialog();

private void Form1_Load(object sender, EventArgs e) 
{ 
    Form2 newForm = new Form2(); 
    Button b = new Button(); 
    newForm.Controls.Add(b); 
    b.Click += new EventHandler(click); 
    this.Show(); 

    // add this line of code... 
    newForm.ShowInTaskbar = false; 

    newForm.ShowDialog(); 

} 

private void click(object sender, EventArgs e) 
{ 
    ((Form)((Control)sender).Parent).ShowInTaskbar = false; 
} 

O simplemente no haga la segunda forma modal. Esto funciona también

private void Form1_Load(object sender, EventArgs e) 
{ 
    Form2 newForm = new Form2(); 
    Button b = new Button(); 
    newForm.Controls.Add(b); 
    b.Click += new EventHandler(click); 
    this.Show(); 

    newForm.Show(); 
} 

que no conocen el mecanismo específico aquí, pero es evidente que lo que está sucediendo es que el cambio de la bandera (que en realidad cambia uno o más WS_EX_xxx estilos de ventana) está haciendo que la bomba modal del ShowDialog() para salir. Esto, a su vez, te está causando (¡finalmente!) Salir de Form1_Load y luego tu newForm queda fuera del alcance y se destruye.

Así que su problema es una compbinación de ShowDialog() y el hecho de que no está preparado para que ShowDialog() salga alguna vez.

Ahora, un modal para no debe aparecer con un icono de la barra de tareas, en primer lugar, que realmente debería ser sólo el 1 icono de la barra de tareas para una aplicación y todo de él es formas modales, ya que cuando un formulario modal está en marcha, el formulario principal está deshabilitado de todos modos. Cuando se minimiza el formulario principal, se ocultan todos los formularios modales que posee, etc.

Así que si realmente desea que este segundo formulario sea modal, no debe darle al usuario la posibilidad de darle un icono de la barra de tareas. Si usar ShowDialog() fue solo código de prueba, entonces no se preocupe. El problema desaparecerá cuando el formulario se ejecute en la bomba de la aplicación principal.

+0

esto era un ejemplo, el usuario puede cambiar el estado de esa variable desde un menú dentro de form2, no es una configuración automática – Fredou

+0

@Fredu: bueno, ahí está su problema. No tiene sentido cambiar esto en vivo después de que la ventana ya se haya creado. En cualquier caso, si el segundo formulario no era modal, no desaparecería cuando cambiaras el indicador –

+0

mirara mi propia respuesta por una solución fea, no hago las especificaciones, las implemento :-( – Fredou

4

No es posible. De hecho, presenté un bug report al respecto en el sitio de comentarios de Microsoft, pero me dieron el pájaro.

Es cierto que es un problema difícil de solucionar, ya que cambiar la propiedad requiere Windows Forms para recrear la ventana desde cero porque está controlada por un indicador de estilo. El tipo que solo se puede especificar en una llamada CreateWindowEx() con el argumento dwExStyle. Volver a crear una ventana hace que sea difícil mantenerla modal, como lo exige la llamada al método ShowDialog().

Windows Forms funciona con muchas limitaciones de User32. Pero no ese.

+0

Encontré una solución fea, mira mi propia respuesta – Fredou

+0

@Fredou: tienes toda la razón, es madre fugly. Pero felicitaciones por haberlo ideado. Sin embargo, intente seguir las pautas comunes de UI, los diálogos no deberían tener establecida su propiedad ShowInTaskbar. –

Cuestiones relacionadas