Как мне «запустить и забыть» форму WinForms? - PullRequest
1 голос
/ 22 марта 2010

Каков хороший метод для создания экземпляра формы WinForms, его отображения (немодально), но при этом нет необходимости хранить ссылки на него? Обычно, как только переменная выходит из области видимости, форма закрывается:

var form = new SuperDuperForm();
form.Show();
// Form has probably been closed instantly

Я не хочу отслеживать экземпляры формы, я хочу, чтобы, когда пользователь закрывает форму, она удалялась. Одна идея, которую я собираюсь реализовать, - это своего рода контроллер, который я использую для открытия и отображения форм, который будет отслеживать их и отслеживать, когда они закрываются с помощью обратных вызовов.

Мне просто интересно, есть ли какие-нибудь хитрые уловки, чтобы избежать этого. Есть идеи?

Ответы [ 4 ]

5 голосов
/ 22 марта 2010

Вам совсем не обязательно это делать - Winforms сделает это за вас. При отображении формы она добавляется в свойство Application.OpenForms , а при закрытии формы она автоматически удаляется.

Форма Windows никогда не будет иметь права на сборку мусора, пока она открыта, а также автоматически удаляется, когда она закрыта. Цитирование из Form.Close документации:

Когда форма закрыта, все ресурсы, созданные внутри объекта, закрываются, и форма удаляется. Вы можете предотвратить закрытие формы во время выполнения, обработав событие Closing и установив свойство Cancel CancelEventArgs, передаваемое в качестве параметра вашему обработчику событий. Если форма, которую вы закрываете, является формой запуска вашего приложения, ваше приложение заканчивается.

Два условия, когда форма не расположена на Закрыть , это когда (1) она является частью приложения с интерфейсом с несколькими документами (MDI), а форма не отображается; и (2) вы отобразили форму, используя ShowDialog. В этих случаях вам нужно будет вручную вызвать Dispose, чтобы пометить все элементы управления формой для сборки мусора.

Другими словами, для общего случая, когда вы «запускаете и забываете», управление ресурсами происходит автоматически.

1 голос
/ 22 марта 2010

У меня нет проблем с открытием форм без сохранения ссылок на них. Однако, если вы создаете форму в отдельном потоке, она исчезнет при выходе из потока (что будет сделано немедленно, поскольку Show возвращается, как только форма отображается).

0 голосов
/ 22 марта 2010

А как насчет простого предложения "using"? Что-то вроде:

использование (Form vForm = new Form ()} { // ваш код идет сюда )

Экземпляр закрывается, как только вы выходите за рамки «использования». Существует также обман простого вызова, такого как (new Form ()). Show (); Быстрый тест показывает мне окно, которое не исчезает при закрытии вызывающего метода.

0 голосов
/ 22 марта 2010

Я думаю, что вы можете создать экземпляр формы, не сохраняя ссылки. Одна из техник, которую я использовал, - отслеживание коллекции Dictionary myForms<sting, Form>. Это означало, что я все еще мог подписаться на событие .FormClosing и избавиться от формы в своей коллекции.

Конечно, если вы хотите сделать это правильно, вы должны использовать Application.OpenForms - см. Ответ Аарона. Я только что узнал об этом свойстве после прочтения его ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...