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;)
Utilicé el método mil veces y nunca me di cuenta de que hay una sobrecarga;) De todos modos, eso funciona. muchas gracias. –
+1, sin el argumento, tratará de encontrar uno. La ventana del escritorio, si es necesario. –