ventanas ventana una otra navegacion modal entre emergentes dentro abrir wpf

otra - ¿Cómo se puede saber si una ventana de WPF está cerrada?



ventana modal c# (7)

De acuerdo con esta conversación en los foros de MSDN WPF (consulte la última publicación), puede verificar si IsLoaded es falso, lo que significa que la ventana es "elegible" para descargar su contenido. ¡Espero que eso funcione para usted!

Estoy trabajando en una aplicación que muestra algunas ventanas secundarias que el usuario puede cerrar o cerrar automáticamente. Mientras depuraba algunas excepciones que se lanzaban, descubrí que estaba intentando llamar a métodos como Hide() en una ventana que ya se había cerrado; esta rama de código en particular era común en ambos casos y no me había dado cuenta de esto.

Una de mis primeras ideas fue buscar una propiedad en Window que indicara que la ventana se había cerrado. Parece que no puedo encontrar uno. En WinForms, buscaría en la propiedad IsDisposed un indicador bastante confiable de que el formulario se había cerrado (no funcionará de manera confiable para un diálogo, pero no estoy trabajando con diálogos). No veo nada equivalente en Window . La documentación para Window.Close() no parece indicar ninguna propiedad que el método Window.Close() . ¿Me estoy perdiendo algo obvio, o es el único método para saber si se ha cerrado una ventana para manejar el evento Closed ? Parece una exigencia estricta para una tarea simple.


Otra forma: Application.Windows contiene una lista de ventanas abiertas. Puede verificar si esta colección contiene su ventana (se elimina después del cierre).

Parece que tienes que llamar a OfType<Window>() porque es una colección especializada.


Espero que esto sea útil para ti:

PresentationSource.FromVisual (window) == null;


No sé por qué la propiedad IsDisposed es interna, pero si no le temes a la reflexión:

var window = new Window(); var propertyInfo = typeof(Window).GetProperty("IsDisposed", BindingFlags.NonPublic | BindingFlags.Instance); var isDisposed = (bool)propertyInfo.GetValue(window);

Dicho esto, la reflexión no debe ser usada en exceso porque ya no estás protegido por la API pública de la clase. Asegúrese de usar al menos pruebas unitarias si va por esa ruta.


Mi solución fue simplemente adjuntar un evento al evento Closed del diálogo:

MikesDialog dlg = new MikesDialog(); dlg.Closed += delegate { // The user has closed our dialog. validationgDlg = null; }; // ...elsewhere in the code... if (validationgDlg != null) { // Our "MikesDialog" is still open... . . . }


Si deriva de la clase Window, puede hacer esto:

public bool IsClosed { get; private set; } protected override void OnClosed(EventArgs e) { base.OnClosed(e); IsClosed = true; }

Tiene una ventaja sobre el registro para el evento Cerrado, no es necesario anular el registro de la devolución de llamada.


Puede agregar una propiedad no estática a WindowClass bool IsClosed , y establecer true en el evento Closed :

public partial class MyWindow : Window { public bool IsClosed { get; set; } = false; public MyWindow() { Closed += MyWindow_Closed; InitializeComponent(); } } private void MyWindow_Closed(object sender, EventArgs e) { IsClosed = true; }