WPF: Должен ли я вручную вызвать Close для окон, открытых методом ShowDialog?

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

4 голоса | спросил aks 12 FebruaryEurope/MoscowbFri, 12 Feb 2010 15:33:21 +0300000000pmFri, 12 Feb 2010 15:33:21 +030010 2010, 15:33:21

2 ответа


0

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

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

  

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

и

  

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

     
  • Окно удаляется из Application.Windows (если объект Application существует).
  •   
  • Окно удаляется из окна владельца, если отношения владелец /владелец были установлены до того, как было показано собственное окно, и после того, как было открыто окно владельца.
  •   
  • Закрытое событие инициируется.
  •   
  • Неуправляемые ресурсы, созданные окном, удаляются.
  •   
  • Если ShowDialog был вызван для отображения окна, ShowDialog возвращается.
  •   
ответил Andy Shellam 12 FebruaryEurope/MoscowbFri, 12 Feb 2010 15:36:31 +0300000000pmFri, 12 Feb 2010 15:36:31 +030010 2010, 15:36:31
0
  

Как насчет кода ниже? реализация 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();
      }

    }
ответил bherto39 2 AM00000090000003331 2013, 09:53:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132