WPF: Должен ли я вручную вызвать Close для окон, открытых методом ShowDialog? - PullRequest
5 голосов
/ 12 февраля 2010

Дело в том, что в WPF Window не реализован интерфейс IDisposable, что заставило меня поверить, что мне не нужно вручную избавляться от него при открытии, вызывая ShowDialog (), но первый комментарий Страница MSDN гласит иначе. Кто-нибудь знает, что это правда?

Ответы [ 2 ]

6 голосов
/ 12 февраля 2010

Только если вы открываете окно, используя Show () вместо ShowDialog ().

Из документации:

Если окно, открытое с помощью вызова ShowDialog и со свойством Button со свойством IsCancel, установленным в true, автоматически закроется при нажатии кнопки или нажатии ESC. Однако, если окно было открыто с помощью команды Show, необходимо явно вызвать Close, например, из обработчика события Click для Button.

и

Закрытие окна вызывает событие закрытия. Если событие закрытия не отменено, происходит следующее:

  • Окно удалено из Application.Windows (если объект Application существует).
  • Окно удаляется из окна владельца, если отношения владелец / владелец были установлены до того, как было показано собственное окно и после того, как было открыто окно владельца.
  • Закрыто событие.
  • Неуправляемые ресурсы, созданные окном, удаляются.
  • Если ShowDialog был вызван для отображения окна, ShowDialog возвращает.
0 голосов
/ 02 августа 2013

Как насчет кода ниже? реализация IDisposable в вашей форме и удаление всех обработчиков событий. Однако Microsoft уже делает это с Close ()?

Также помогает руководство GC.Collect?

Некоторые ссылки и посты:

Как правильно утилизировать окно WPF?

Как правильно утилизировать окно WPF?

    /// <summary>
    /// Interaction logic for MyForm.xaml
    /// </summary>
    public partial class MyForm: IDisposable
    {        

      public MyForm()
      {}


      private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
      {            
        Dispose();
      }

      public void Dispose()
      {

        try{
             _resourcescollection.Clear();
             _resourcescoll = null;
             //close other resources
            }
        catch(exception ex)
        {}
        EventHelper.RemoveAllEventHandlers(_resources);
        EventHelper.RemoveAllEventHandlers(_timer);
        EventHelper.RemoveAllEventHandlers(_etc);
        EventHelper.RemoveAllEventHandlers(this);        
      }

      ~MyForm()
      {
        Dispose();
      }

    }
...