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 tratando de 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.¿Cómo se puede saber si una ventana de WPF está cerrada?
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 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 modifique. ¿Me falta 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.
Esta propiedad no se puede acceder desde otro hilo, y la invocación de una llamada al bloque luna dispuesta infinitamente. Así que terminé usando mi propia variable de instancia para eso y accedí a ella de una manera que no requiere sincronización (isClosed = true al principio del método OnClosed, luego lo leí más tarde nuevamente). – ygoe
Esto no funciona si los eventos aún se están procesando.Por ejemplo, si un botón Click handler cierra una ventana y luego abre otra y la inicialización de la segunda ventana comprueba 'IsLoaded' de la primera, devolverá' true'. – nmclean