2009-02-20 10 views
41

Tengo una ventana WPF que estoy creando desde otra ventana, show() ing, luego dejándola cerrar(). Cuando la ventana se cierra, espero que muera, llame a su constructor y elimine todos sus elementos secundarios (como temporizadores ...).¿Cuál es la forma correcta de deshacerse de una ventana de WPF?

¿Cuál es la forma correcta de invocar tal acción?

Respuesta

52

Close() libera todos los recursos no administrados y cierra todos los que tengan Window s.

Cualquier otro recurso gestionado del que necesite una eliminación determinista debe tratarse desde el evento Closed.

Reference

(nota: suprime la respuesta anterior, que era una suposición completamente errónea)

+1

¡La clase Window en WPF no tiene un método Dispose()! –

+6

¿Quizás debería leer primero los documentos? –

11

Hay muy pocos elementos de WPF que realmente necesitan ser dispuestos de manera explícita, a diferencia de las formas de Windows.

En el caso de la ventana, al llamar a Close() basta con eliminar todos los recursos gestionados y no gestionados correspondientes al documentation.

+3

Mis documentos dicen que solo se eliminan los recursos no administrados ... –

1

Cerrar la ventana y confiar en que ha liberado todos los recursos y todos sus elementos secundarios hará que todos los elementos que se comporten bien en el árbol de lógica sean basura.

Digo "bien educado" porque teóricamente es posible tener un elemento que hace algo como crear un hilo que no se detiene correctamente, pero en la práctica si está utilizando el marco básico de WPF y controles bien escritos, debería estar bien solo para liberar todo.

6

Por las dudas, añadiré mis dos centavos.

Mi problema fue que no hice suficiente solución de problemas. Mi ventana estaba una ventana secundaria que podría ser abierto, cerrado y abierto de nuevo, por lo que añadió lo siguiente para evitar que se cierre por completo:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { 
    e.Cancel = true; 
    this.Hide(); 
} 

Sin embargo, cuando fue llamado window.close, sólo se ocultaba el ventana. Finalmente he cogido encendido y añade la siguiente:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { 
    e.Cancel = true; 
    this.Hide(); 
} 

public void Close() { 
    this.Closing -= Window_Closing; 
    //Add closing logic here. 
    base.Close(); 
} 

Esto funciona bien - que elimina el controlador de eventos prevención de la ventana se cierre y, a continuación, lo cierra.

+0

Ja, tengo exactamente el mismo error (se me olvidó cancelar la suscripción del controlador de eventos de prevención de proximidad) cuando intento cerrar una ventana secundaria. Me salvó el día :) – Nipheris

Cuestiones relacionadas