ventanas ventana una otra navegacion modal entre dialogbox dentro cerrar abrir .net wpf

.net - una - navegacion entre ventanas wpf



¿Cómo determino si una ventana de WPF es modal? (7)

¿Cuál es la forma más fácil de averiguar si una ventana se abre de forma modal o no?

CLARIFIACTION: abro una ventana llamando

myWindow.ShowDialog();

Tengo un pie de página con un botón "Aceptar" y "Cancelar" que solo quiero mostrar si la ventana está abierta de forma modal. Ahora me doy cuenta de que puedo establecer una propiedad al hacer esto:

myWindow.IsModal = true; myWindow.ShowDialog();

Pero quiero que la ventana en sí misma tome esa determinación. Quiero comprobar en el evento "Cargado" de la ventana si es modal o no.

ACTUALIZAR La propiedad "IsModal" no existe en realidad en una ventana de WPF. Es una propiedad que he creado. ShowDialog () bloquea el hilo actual. Supongo que puedo determinar si la ventana se abre a través de ShowDialog () comprobando si el hilo actual está bloqueado. ¿Cómo voy a hacer eso?


¿Sería posible verificar el padre de la ventana para ver si está deshabilitado? No estoy seguro de si esto puede hacerse a través de las API de WPF o no, pero si nada más puede obtener el HWND de la ventana de WPF, obtenga su padre a través de Win32 P / Invoke (o lo que sea), y luego verifique si está desactivado o no

Definitivamente no es un método limpio, pero parece que podría funcionar.


De acuerdo, ya 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 principal de mi Ventana (Ventana1) Cargado, lo 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 cambió de False a True y me da True, así que sé que se configuró IsModal. MyBase.ShowDialog () fuerza a la clase base a cargarse como Modal. Shadows nos permite anular el comportamiento predeterminado aunque el método ShowDialog () no se haya declarado como reemplazable.

Si bien no se "autodetermina", no requiere que ingrese ningún valor booleano desde el exterior, y no requiere que configure el IsModal desde afuera, lo establece dentro de sí mismo, se puede acceder desde el exterior si así lo desea. eligió usarlo de esa manera. Establece el valor solo si se carga con el método ShowDialog () y no si se usa el método Show (). Dudo que encuentres un método mucho más simple para hacer esto.


Usando la automatización de la interfaz de usuario en Windows, he encontrado algo como esto:

void Window2_Loaded(object sender, RoutedEventArgs e) { var hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle; var el = AutomationElement.FromHandle(hwnd); Object oPattern = null; if (el.TryGetCurrentPattern(WindowPattern.Pattern, out oPattern)) { var pattern = oPattern as WindowPattern; this.Title = pattern.Current.IsModal.ToString(); } }

Pero esto parece no funcionar. Hay una propiedad IsModal http://msdn.microsoft.com/en-us/library/system.windows.automation.provider.iwindowprovider.ismodal.aspx debe haber una forma adecuada de obtener AutomationElement para la ventana y comprobar si IsModal La propiedad de esto es verdadera a través de la Automatización.


una ventana modal detendrá el procesamiento hasta que se cierre.

Este ejemplo muestra la visualización de una ventana no modal

dim f as myWindow f.show someOtherMethod()

En este ejemplo, someOtherMethod se ejecuta inmediatamente después de que se inicia la ventana.

Este ejemplo muestra la visualización de un modal:

dim f as myWindow f.showDialog someOtherMethod()

En este ejemplo, someOtherMethod () no se ejecutará hasta que el método ShowDialog regrese (lo que significa que la ventana modal se ha cerrado)

EDIT debido a la aclaración: anule el ShowDialog y pase un booleano.

dim f as MyWindow f.ShowDialog(true)

luego en la ventana

Public Function Shadows ShowDialog(myVar as boolean) As Boolean if myVar then ShowButtons() return mybase.ShowDialog() End Function



Hay un campo privado _showingAsDialog cada vez que una ventana de WPF es 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.


Aquí hay un fragmento de convertidor que es útil para ocultar elementos cuando el método ShowDialog invoca la ventana:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Window window = value as Window; if (window != null) { var showingAsDialogFieldInfo = typeof(System.Windows.Window).GetField("_showingAsDialog", BindingFlags.NonPublic | BindingFlags.Instance); if ((bool) showingAsDialogFieldInfo.GetValue(window) == false) { return Visibility.Visible; } } return Visibility.Hidden; }