2010-05-27 22 views
6

Tengo una aplicación Windows Forms sin bordes.Windows Forms and ShowDialog problema

La ventana principal crea otras formas (cuadros de diálogo simples donde puedo hacer clic en sí o no) con ShowDialog(). Cada diálogo creado no está visible en la barra de tareas, mi aplicación tiene solo una entrada en la barra de tareas que enfoca mi aplicación (y si un diálogo está abierto, uno está enfocado). Si uso ALT + TAB para pasar a todas las ventanas abiertas, solo veo una entrada también.

Sin embargo, si el diálogo se crea mientras mi aplicación no tiene el foco (por ejemplo, el usuario inicia una tarea larga, comienza a trabajar en otra cosa y mientras está en segundo plano, mi aplicación muestra un diálogo " Tarea hecha ... ") y quiero volver a mi aplicación, las cosas se están poniendo raras.

  • Si hago clic en la barra de tareas para enfocar mi aplicación, la ventana principal se enfoca (no el cuadro de diálogo).
  • No puedo usar la ventana principal (porque todavía hay un diálogo modal abierto).
  • Windows 7 ALT +TAB vista previa muestra el diálogo, mientras que la vista previa al pasar el ratón la barra de tareas muestra la ventana principal (en la conducta normal tanto en mostrar el diálogo frente a la ventana principal).
  • La única manera de hacer mi solicitud de nuevo utilizable es ALT +TAB a la entrada y cerrar el cuadro de diálogo modal.
  • Si uso ALT + TAB, solo aparece el cuadro de diálogo y la ventana principal sigue en el fondo.

¿Hay alguna manera de evitar que esto suceda? Sé qué hacer, pero la mayoría de los clientes piensan que la aplicación se bloqueó porque la ventana principal no responde.

Actualización:

La solución es pasar la ventana de nivel superior para el método ShowDialog() (en la mayoría de casos y si se utiliza en una forma que sería el "este").

Como no quería refacturar todo el código, y todas mis formas heredan de "MyCustomFormBase" aquí hay una pequeña solución que funciona muy bien.

Public Class MyCustomFormBase 

    Public Shared Property ApplicationMainForm() As Form 
     Get 
      Return _applicationMainform 
     End Get 
     Set(ByVal value As Form) 
      _applicationMainform = value 
     End Set 
    End Property 
    Private Shared _applicationMainform As Form 

    Public Shadows Function ShowDialog() As DialogResult 
     If MyCustomFormBase.ApplicationMainForm IsNot Nothing Then 
      Return MyBase.ShowDialog(MyCustomFormBase.ApplicationMainForm) 
     Else 
      Return MyBase.ShowDialog() 
     End If 
    End Function 

    Public Shadows Function ShowDialog(ByVal owner As IWin32Window) As DialogResult 
     Return MyBase.ShowDialog(owner) 
    End Function 

End Class 

En el constructor de la ventana principal que utilizan

MyCustomFormBase.ApplicationMainForm = Me 

vez. Me ayudó medio día a refactorizar;)

Respuesta

4

¿Ha intentado pasar una referencia a la ventana principal a ShowDialog llamadas?

// assuming this code is in the main form (so "this" refers to the main form) 
DialogForm dialog = new DialogForm(); 
DialogResult result = dialog.ShowDialog(this); 

Presupuesto de la documentation of this overload:

Esta versión del método ShowDialog le permite especificar una forma o control específico que tendrá el cuadro de diálogo que se muestra . Si utiliza la versión de este método que no tiene los parámetros , el cuadro de diálogo que se muestra sería propiedad automáticamente de la ventana actualmente activa de su aplicación .

+0

Utilicé el método mil veces y nunca me di cuenta de que hay una sobrecarga;) De todos modos, eso funciona. muchas gracias. –

+0

+1, sin el argumento, tratará de encontrar uno. La ventana del escritorio, si es necesario. –