Как закрыть приложение wpf
В WPF приложение проходит через простой жизненный цикл. Вскоре после запуска приложения создается объект Application. Во время его выполнения возникают различные события приложения, которые можно отслеживать. И, наконец, когда объект приложения освобождается, приложение завершается.
WPF позволяет создавать полноценные приложения, создающие иллюзию работы в веб-браузере. Эти приложения называются XBAP. Относительно XBAP-приложений следует отметить, что в них применяется тот же класс Application, генерируются те же события жизненного цикла и используются ресурсы сборки таким же способом, что и в стандартных приложениях на основе WPF.
Создание объекта Application
Простейший способ использования класса Application предусматривает его создание вручную. В следующем примере демонстрируется абсолютный минимум: точка входа в приложение (метод Main()), которая создает окно по имени Window1 и запускает новое приложение:
Запущенное подобным образом приложение продолжает работу до тех пор, пока главное окно и все его прочие окна не будут закрыты. В этот момент метод Run() вернет управление и, прежде чем завершится приложение, будет выполнен любой дополнительный код в Main().
Чтобы запустить приложение с использованием метода Main(), необходимо определить класс, который содержит метод Main() в качестве стартового объекта в Visual Studio. Чтобы сделать это, дважды щелкните на узле Properties (Свойства) в Solution Explorer и измените выбор в списке Startup Object (Стартовый объект). Обычно это делать не понадобится, потому что Visual Studio создает метод Main() автоматически на основе шаблона приложения XAML.
Наследование специального класса приложения
Хотя подход, описанный в предыдущем разделе (с созданием экземпляра базового класса Application и вызовом Run()), работает вполне удовлетворительно, при создании нового приложения WPF этот вариант в Visual Studio не используется.
Вместо этого Visual Studio создает специальный класс, унаследованный от Application. В простом приложении такой подход не дает существенного эффекта. Однако если планируется обработка событий приложения, он предоставляет более изящную модель, потому что код обработки событий может быть помещен в класс, производный от Application.
Модель, реализованная в Visual Studio в отношении класса Application, по сути, та же, что и модель, применяемая для окон. Начальная точка — шаблон XAML, по умолчанию называемый App.xaml. Ниже показано, как примерно он выглядит:
Атрибут Class используется в XAML для создания класса, унаследованного от элемента. Таким образом, создается класс, унаследованный от Application, по имени WpfApplication1.App. (WpfApplication1 — название проекта, совпадающее с пространством имен, в котором определен класс, а App — имя, используемое Visual Studio для специального класса, унаследованного от Application. При желании это имя класса можно заменить более выразительным.)
Дескриптор Application не только создает специальный класс приложения, но также устанавливает свойство StartupUri для идентификации документа XAML, представляющего главное окно. В результате не понадобится явно создавать экземпляр этого окна в коде — анализатор XAML сделает это сам.
Как и с окном, класс приложения определен в двух отдельных частях, которые объединяются вместе во время компиляции. Автоматически сгенерированная часть в проекте невидима, но она содержит точку входа Main() и код для запуска приложения. Выглядит это примерно так, как показано ниже:
Если вы действительно заинтересованы в том, чтобы увидеть специальный класс приложения, созданный шаблоном XAML, загляните в файл App.g.cs в папке obj --> Debug внутри каталога проекта.
Единственное отличие между автоматически сгенерированным кодом, показанным здесь, и специальным классом приложения, который вы можете создать самостоятельно, состоит в том, что автоматически сгенерированный класс использует свойство StartupUri вместо установки свойства MainWindow или передачи главного окна в качестве параметра методу Run(). Применяя тот же самый формат URI, можно создать специальный класс приложения, использующий этот подход.
Понадобится создать объект относительного URI, который именует документ XAML, находящийся в проекте. (Этот документ XAML компилируется и встраивается в сборку приложения в виде ресурса BAML. Именем ресурса является имя исходного файла XAML.)
Останов приложения
Обычно класс Application оставляет приложение активным до тех пор, пока открыто хотя бы одно окно. Если такое поведение не нужно, можно изменить значение свойства Application.ShutdownMode. При создании объекта Application вручную, свойство ShutdownMode должно быть установлено перед запуском Run(). Если используется файл App.xaml, можно просто установить свойство ShutdownMode в коде разметки XAML.
Режим останова приложения может принимать три значения:
OnLastWindowClose
Поведение по умолчанию — приложение выполняется до тех пор, пока существует хотя бы одно открытое окно. После закрытия главного окна свойство Application.MainWindow по-прежнему ссылается на объект, представляющий закрытое окно. (Дополнительно можно использовать код для переназначения свойства MainWindow, чтобы оно указывало на другое окно.)
OnMainWindowClose
Это традиционный подход — приложение остается активным только пока открыто главное окно
In this article, you'll learn about the different ways to close a window or dialog box. A user can close a window by using the elements in the non-client area, including the following:
- The Close item of the System menu.
- Pressing ALT + F4 .
- Pressing the Close button.
- Pressing ESC when a button has the IsCancel property set to true on a modal window.
When designing a window, provide more mechanisms to the client area to close a window. Some of the common design elements on a window that are used to close it include the following:
- An Exit item in the File menu, typically for main application windows.
- A Close item in the File menu, typically on a secondary application window.
- A Cancel button, typically on a modal dialog box.
- A Close button, typically on a modeless dialog box.
Once a window is closed, the same object instance can't be used to reopen the window.
For more information about the life of a window, see Overview of WPF windows: Window lifetime.
Close a modal window
When closing a window that was opened with the ShowDialog method, set the DialogResult property to either true or false to indicate an "accepted" or "canceled" state, respectively. As soon as the DialogResult property is set to a value, the window closes. The following code demonstrates setting the DialogResult property:
You can also call the Close method. If the Close method is used, the DialogResult property is set to false .
Once a window has been closed, it can't be reopened with the same object instance. If you try to show the same window, a InvalidOperationException is thrown. Instead, create a new instance of the window and open it.
Close a modeless window
When closing a window that was opened with the Show method, use the Close method. The following code demonstrates closing a modeless window:
Close with IsCancel
The Button.IsCancel property can be set to true to enable the ESC key to automatically close the window. This only works when the window is opened with ShowDialog method.
Hide a window
Instead of closing a window, a window can be hidden with the Hide method. A hidden window can be reopened, unlike a window that has been closed. If you're going to reuse a window object instance, hide the window instead of closing it. The following code demonstrates hiding a window:
Cancel close and hide
If you've designed your buttons to hide a window instead of closing it, the user can still bypass this and close the window. The Close item of the system menu and the Close button of the non-client area of the window, will close the window instead of hiding it. Consider this scenario when your intent is to hide a window instead of closing it.
If a window is shown modally with ShowDialog, the DialogResult property will be set to null when the window is hidden. You'll need to communicate state back to the calling code by adding your own property to the window.
When a window is closed, the Closing event is raised. The handler is passed a CancelEventArgs, which implements the Cancel property. Set that property to true to prevent a window from closing. The following code demonstrates how to cancel the closure and instead hide the window:
There may be times where you don't want to hide a window, but actually prevent the user from closing it. For more information, see Overview of WPF windows: Cancel window closure.
среди многих других. Ничего не работает.
для выхода из приложения вы можете позвонить
как описано в документации к Application.Shutdown метод вы также можете изменить поведение выключения вашего приложения, указав ShutdownMode:
- когда ShutdownMode установлен в OnLastWindowClose.
- когда ShutdownMode имеет значение OnMainWindowClose.
- когда пользователь завершает сеанс и событие SessionEnding либо необработано, либо обрабатывается без отмены.
обратите внимание, что Application.Current.Shutdown(); может вызываться только из потока, который создал Application "объект", т. е. обычно основной поток.
Если вы действительно нужно, чтобы закрыть вы также можете использовать окружающая среда.Exit (), но это совсем не изящно (больше похоже на завершение процесса).
использовать его следующим образом:
As wuminqi сказал, Application.Current.Shutdown(); необратимо, и я считаю, что он обычно используется для принудительного закрытия приложения в такие моменты, как когда пользователь выходит из системы или выключает Windows.
вместо этого позвоните this.close() в главном окне. Это аналогично нажатию Alt + Ф4 или кнопку Закрыть [x]на окне. Это приведет к закрытию всех других принадлежащих окон и в конечном итоге вызовет Application.Current.Shutdown(); пока близко не отмененный. См. документацию MSDN на закрыть окно.
, потому что this.close() отменяется вы можете поместить в диалоговое окно подтверждения сохранения изменений в обработчике событий закрытия. Просто сделайте обработчик событий для <Window Closing=". "> , и e.Cancel соответственно. (См. документация MSDN для получения более подробной информации о том, как это сделать.)
при необходимости используйте любое из следующих действий:
1.
2.
прежде всего методы будут вызывать closing event of Window класс и выполнение могут остановиться в какой-то момент (обычно приложения ставят диалоги, такие как 'вы уверены?' иливы хотите сохранить данные перед закрытием?', прежде чем окно будет закрыто полностью)
3. но если вы хотите завершить приложение без какого-либо предупреждения немедленно. Используйте ниже
это должно сделать трюк:
Если вам интересно, вот некоторые дополнительные материалы, которые я нашел полезными:
вот как я делаю мои:
Я только призываю Application.Current.ShutDown() из главного окна приложения, все остальные окна использовать this.Close() . В моем главном окне, Window_Closing(. ) обрабатывает верхний правый . Если какой-либо из методов вызывает window closer, Window_Closing(. ) хватает событий для выключения, если пользователь подтверждает.
причина, по которой я на самом деле использовать Application.Current.Shutdown() в моем главном окне я заметил, что если ошибка дизайна была сделана, и я не объявил родителя одного из моих windows в приложении, если это окно открыто без отображения до последнего активного закрытия окна, я остаюсь со скрытым окном, работающим в фоновом режиме. Приложение не будет закрыто. Единственный способ предотвратить полную утечку памяти - это войти в Диспетчер Задач закрыть приложение. Application.Current.Shutdown() защищает меня от непреднамеренных недостатков дизайна.
это из моего личного опыта. В конце концов, используйте то, что лучше для вашего сценария. Это просто еще одна информация.
Application является статическим классом. Это не относится к текущему приложению. Вам нужно добраться до текущего приложения, а затем закрыть его, как это:
Среди многих других. Ничего не работает
Для выхода из приложения вы можете позвонить
Как описано в документации к Application.Shutdown методу, вы также можете изменить поведение завершения работы вашего приложения, указав ShutdownMode :
- Когда ShutdownMode имеет значение OnLastWindowClose.
- Когда ShutdownMode имеет значение OnMainWindowClose.
- Когда пользователь завершает сеанс и событие SessionEnding либо не обрабатывается, либо обрабатывается без отмены.
Также обратите внимание, что он Application.Current.Shutdown(); может быть вызван только из потока, который создал Application объект, то есть обычно из основного потока.
Как я уже говорил, это не странно. В WPF Application это статический класс. Application.Current - это ссылка на ваше текущее приложение. На мой взгляд, это немного странно в том смысле, что это неочевидно на первый взгляд, и оно настолько отклоняется от прошлых моделей, чтобы отбросить людей. Совершенно очевидно, что это работает, конечно. Если вы позвоните, Application.Current.Shutdown(); ваша функция не вернется сразу. Вам также нужно позвонить return; для этого. Я использовал это, когда из одного окна появляется другое окно, и в событии window_closed этого окна я добавил этот код. все окна исчезают, но после запуска всплывающего окна программа все еще работает. @TimothyP Нет, Application это НЕ статический класс. Наличие Application.Current статического члена не означает, что он статический. Вместо этого это нормальный класс, который можно получить.Если вам действительно нужно это закрыть, вы также можете использовать Environment.Exit () , но это совсем не изящно (больше похоже на завершение процесса).
Используйте это следующим образом:
Environment.Exit() нужен хотя бы один параметр, код выхода. Используйте, Environment.Exit(0) если вас не интересует код выхода. Этот метод фактически закрыл все. Мое приложение оставляло что-то работающее (форма закрывалась, но процесс все еще работал) с Application.Current.Shutdown(); Environment.Exit - определенно правильный способ обеспечить завершение работы приложения. С Application.Current.Shutdown вы можете легко запустить приложение на неопределенное время, если у вас есть код, который возвращается в диспетчер. С Application.Current.Shutdown(); моим Closing событием было вызвано, когда я просто хотел немедленно закрыть приложение. Так Environment.Exit(0); был лучший выбор.Как сказал Вуминци , Application.Current.Shutdown(); он необратим, и я считаю, что он обычно используется для принудительного закрытия приложения в такие моменты, как когда пользователь выходит из системы или закрывает Windows.
Вместо этого позвоните this.close() в главное окно. Это то же самое, что нажать Alt + F4 или закрыть кнопку [x] в окне. Это приведет к закрытию всех других принадлежащих ему окон и вызовет их, Application.Current.Shutdown(); пока действие закрытия не было отменено. Пожалуйста, смотрите документацию MSDN по закрытию окна .
Кроме того, поскольку его this.close() можно отменить, вы можете поместить его в диалог подтверждения сохранения изменений в обработчике закрывающих событий. Просто создайте обработчик события <Window Closing=". "> и измените его e.Cancel соответствующим образом. ( Подробнее о том, как это сделать, см. Документацию MSDN .)
+1 Я решил пойти с этим, тем более, что мне нужно сохранить открытые файлы перед тем, как выйти из приложения. Здесь важно отметить, что Аллен указал на очень важный факт: все остальные окна будут закрыты. Вы должны убедиться, что вы заявляете право собственности. Если у вас есть окно, которое работает, а затем вы открываете другое окно, но еще не открываете его, после закрытия активного окна скрытое окно заставит приложение продолжать работу. У вас будет потенциальная утечка памяти, если вы не закроете это окно другими средствами (диспетчер задач и т. Д.). Я проверял это.При необходимости используйте любое из следующего:
1.
2.
Выше все методы будут вызывать closing event из Window класса и выполнение может остановиться на каком - то момент (причина , как правило , приложение ставить диалоги , как «вы уверены?» Или « вы бы хотели сохранить данные перед закрытием? », Перед тем, как окно полностью закрыто)
3. Но если вы хотите прекратить приложение без предупреждения немедленно. Используйте ниже
Это должно сделать трюк:
Если вам интересно, вот некоторые дополнительные материалы, которые я нашел полезными:
Вот как я делаю мои:
Я звоню только Application.Current.ShutDown() из главного окна приложения, все остальные окна используют this.Close() . В моем главном окне Window_Closing(. ) обрабатывает верхнюю правую x кнопку. Если какой-либо из методов вызывает окно ближе, Window_Closing(. ) захватывает событие для выключения, если пользователь подтверждает.
Причина, по которой я действительно использую Application.Current.Shutdown() свое главное окно, заключается в том, что я заметил, что если была допущена ошибка проектирования, и я не объявил родителя одного из моих окон в приложении, если это окно открывается без предварительного отображения до последнего закрытия активного окна у меня остается скрытое окно, работающее в фоновом режиме. Приложение не будет закрыто. Единственный способ предотвратить полную утечку памяти - это зайти в диспетчер задач, чтобы закрыть приложение. Application.Current.Shutdown() защищает меня от непреднамеренных недостатков дизайна.
Это из моего личного опыта. В конце концов, используйте то, что лучше для вашего сценария. Это просто еще одна часть информации.
Application это статический класс. Это не относится к текущему приложению. Вам нужно перейти к текущему приложению, а затем закрыть его следующим образом:
Еще один способ сделать это:
Это заставит убить ваше приложение. Это всегда работает, даже в многопоточном приложении.
Примечание: просто будьте осторожны, чтобы не потерять несохраненные данные в другом потоке.
Среди многих других. Ничего не работает.
ОТВЕТЫ
Ответ 1
Чтобы выйти из приложения, вы можете позвонить
Как описано в документации к Application.Shutdown , вы также можете изменить поведение выключения приложения, указав ShutdownMode:
- Когда ShutdownMode установлен на OnLastWindowClose.
- Когда для параметра ShutdownMode установлено значение OnMainWindowClose.
- Когда пользователь заканчивает сеанс, и событие SessionEnding либо необработанно, либо обрабатывается без отмены.
Также обратите внимание, что Application.Current.Shutdown(); может вызываться только из потока, создавшего объект Application , т.е. обычно основной поток.
Ответ 2
Если вам действительно нужно закрыть его, вы также можете использовать Environment.Exit(), но это совсем не изящно (больше похоже на завершение процесс).
Ответ 3
Как сказал wuminqi, Application.Current.Shutdown(); является необратимым, и я считаю, что он обычно используется для принудительного закрытия приложения, например, когда пользователь выходит из системы или выключает Windows. Вместо этого вызовите this.close() в главное окно. Это то же самое, что нажать "ALT-F4" или кнопку закрытия [x] в окне. Это приведет к закрытию всех остальных закрытых окон и вызовет вызов Application.Current.Shutdown(); , пока действие закрытия не будет отменено. См. Документацию MSDN на Закрытие окна.
Кроме того, поскольку this.close() можно отменить, вы можете поместить в диалог подтверждения изменений изменений в обработчик закрывающего события. Просто создайте обработчик событий для <Window Closing=". "> и измените e.Cancel соответственно. (Подробнее о том, как это сделать, см. документ MSDN
Ответ 4
Это должно сделать трюк:
Если вам интересно, вот некоторые дополнительные материалы, которые я нашел полезными:
Ответ 5
При необходимости используйте любое из следующих действий:
1.
2.
Прежде всего методы вызовут closing event класса Window , и выполнение может прекратиться в какой-то момент (так как обычно приложения ставят диалоги типа ) уверен? ' или' Вы хотите сохранить данные перед закрытием? ', прежде чем окно будет полностью закрыто)
3. Но если вы хотите немедленно закрыть приложение без предупреждения. Используйте ниже
Ответ 6
Не должно быть Application.ShutDown(); или .Exit().
Приложение представляет собой статический класс. Он не относится к текущему приложению Вам нужно перейти к текущему приложению, а затем закрыть его следующим образом:
Ответ 7
Вот как я делаю свое:
Я вызываю только Application.Current.ShutDown() из главного окна приложения, все остальные окна используют this.Close() . В моем главном окне Window_Closing(. ) обрабатывается верхняя правая кнопка x . Если какой-либо из методов вызывает приближение окна, Window_Closing(. ) захватывает событие для завершения, если пользователь подтверждает.
Я действительно использую Application.Current.ShutDown() в своем главном окне - это то, что я заметил, что если ошибка дизайна была сделана, и я не объявил родителя одного из моих окон в приложении, если это окно открывается без отображения перед последним активным закрытием окна, у меня осталось скрытое окно, работающее в фоновом режиме. Приложение не будет закрыто. Единственный способ предотвратить полную утечку памяти - это войти в диспетчер задач, чтобы закрыть приложение. Application.Current.ShutDown() защищает меня от непреднамеренных недостатков дизайна.
Это из моего личного опыта. В итоге используйте то, что лучше всего подходит для вашего сценария. Это всего лишь еще одна информация.
Читайте также: