Solución:
Hay un campo privado _showingAsDialog
siempre que una ventana de WPF sea un cuadro de diálogo modal. Puede obtener ese valor a través de la reflexión e incorporarlo en un método de extensión:
public static bool IsModal(this Window window)
{
return (bool)typeof(Window).GetField("_showingAsDialog", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(window);
}
El valor se establece en verdadero cuando la ventana se muestra como modal (ShowDialog) y se establece en falso una vez que se cierra la ventana.
De http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c95f1acb-5dee-4670-b779-b07b06afafff/
“System.Windows.Interop.ComponentDispatcher.IsThreadModal puede indicarle si el subproceso que realiza la llamada está ejecutando actualmente un hwnd modal”.
Bien, desde que mi última idea fue rechazada, lo probé. esto funciona, y lo probé en una nueva aplicación WPF, así que sé que funciona:
En el evento Loaded de mi ventana principal (Window1), hice:
Dim frm As New Window2
frm.ShowDialog()
En mi Window2 sombreé el método ShowDialog ()
Private _IsModal As Boolean = False 'This will be changed in the IsModal method
Public Property IsModal() As Boolean
Get
Return _IsModal
End Get
Set(ByVal value As Boolean)
_IsModal = value
End Set
End Property
Public Shadows Sub ShowDialog()
IsModal = True
MyBase.ShowDialog()
End Sub
En mi evento Loaded, activé un cuadro de mensaje para asegurarme de que la propiedad IsModal se cambiara de False a True y me da True, así que sé que IsModal se configuró. MyBase.ShowDialog () luego obliga a que la clase base se cargue como modal. Shadows nos permite anular el comportamiento predeterminado a pesar de que el método ShowDialog () no se declaró como anulable.
Si bien no se “autodetermina”, no requiere que pases ningún valor booleano desde el exterior, y no requiere que establezcas el IsModal desde fuera, lo establece dentro de sí mismo, es accesible desde el exterior si así lo deseas. eligió usarlo de esa manera. Establece el valor solo si se cargó usando el método ShowDialog () y no si usa el método Show (). Dudo que encuentre un método mucho más simple para hacer esto.