закрыть приложение wpf c
Закрыть приложение wpf c
Свойство ShutdownMode указывает на способ выхода из приложения и может принимать одно из следующих значений:
OnMainWindowClose : приложение работает, пока открыто главное окно
OnLastWindowClose : приложение работает, пока открыто хотя бы одно окно
OnExplicitShutdown : приложение работает, пока не будет явно вызвано Application.Shutdown()
Задать свойство ShutdownMode можно в коде xaml:
либо определить в App.xaml.cs:
События приложения
Класс Application определяет ряд событий, который могут использоваться для всего приложения:
Startup : происходит после вызова метода Application.Run() и перед показом главного окна
Activated : происходит, когда активизируется одно из окон приложения
Deactivated : возникает при потере окном фокуса
SessionEnding : происходит при завершении сеанса Windows при перезагрузке, выключении или выходе из системы текущего пользователя
DispatcherUnhandledException : возникает при возникновении необработанных исключени
LoadCompleted : возникает при завершении загрузки приложения
Exit : возникает при выходе из приложения Это может быть закрытие главного или последнего окна, метод Application.Shutdown() или завершение сеанса
Так же, как и для элементов, обработчики события определяются для одноименных атрибутов в разметке xaml. Например, обработаем событие Startup:
Затем в файле связанного кода App.xaml.cs пропишем обработчик события:
В результате при запуске каждой новой копии данного приложение обработчик события будет определять, запущена ли уже приложение, и если оно запущено, то данная копия завершит свою работу.
Создание заставки приложения
Обращение к текущему приложению
Таким образом, при нажатии на кнопку мы получим одно или несколько сообщений с именами всех окон данного приложения.
WPF MVVM Закрыть окно
Я создал приложение WPF с использованием MVVM, и у меня возникают проблемы с закрытием / открытием окон. В моем окне входа в систему я использую следующий метод, чтобы закрыть окно входа в систему и открыть окно WindowOPHome одним нажатием кнопки:
Все работает нормально, и окно входа закрывается, пока открывается окно WindowOPHome. Когда я пытаюсь закрыть окно WindowOPHome и открыть окно WindowMainAdmin нажатием кнопки, аналогичной действию окна входа / WindowOPHome, окно WindowMainAdmin открывается на долю секунды, а затем исчезает, а WindowOPHome никогда не покидает зрение. Ниже приведен код для закрытия WindowOPHome и открытия WindowMainAdmin:
Любая помощь будет принята с благодарностью! Пожалуйста, дайте мне знать, если есть какие-то другие части кода, которые вам нужны. Спасибо огромное!
4 ответа
Я бы предложил вам явно закрыть окно, которое вы хотите закрыть, а не предполагать, что это текущее главное окно.
В MVVM есть много разных способов сделать это, вы можете использовать прикрепленное поведение или передать окно в модель представления с помощью параметра команды, например:
В кнопке xaml для просмотра:
В команде execute метод в модели представления:
.
Кроме того, вы можете перебирать все окна, пока не найдете нужное.
Возможно, вы захотите проверить какое-либо другое свойство, кроме простого закрытия первого из этого типа, если вам нужно иметь более одного открытого окна.
Вы можете даже адаптировать это, чтобы быть статическим методом закрытия в каждом классе окна.
Я думаю, что когда вы создаете окно администратора, программа считает ваше окно администратора текущим главным окном и закрывает его. Чтобы избежать этого, вы можете явно закрыть желаемое окно. Я предлагаю реализовать MainViewModel для управления всеми вашими окнами. В этом примере предполагается, что вы хотите открыть только одно окно.
В представлении (любое окно):
Все это отличные решения! Я выбрал решение cjmurph, потому что оно было очень простым (для моего слабого ума), и я могу легко адаптировать его для будущего использования. Смотрите реализованный код ниже. Еще раз спасибо всем!
XAML
Вы можете создать чистое решение MVVM для этой проблемы, используя несколько вспомогательных классов.
В приложении сначала создайте свойство в ViewModel
Затем привязать к нему в представлении, используя наш вспомогательный класс.
Приложение WPF не закрывается при закрытии главного окна
Я привык к программированию WinForms в Visual Studio,но я хотел попробовать WPF.
я добавил еще одно окно в свой проект под названием Window01. Главное окно называется MainWindow. Перед public MainWindow() конструктор объявляю Window01:
теперь я создаю экземпляр этого окна в:
«забавная» вещь здесь заключается в том, что если я запускаю приложение (с отладкой) и выйдите из него через несколько секунд (я ничего не делаю в приложении), Visual Studio не прекращает отладку, как будто приложение все еще работает.
почему такое странное поведение?
5 ответов
в своем MainWindow.xaml.cs попробуйте сделать это:
по этой ссылке вы также можете установить ShutdownMode в XAML:
приложения перестают работать только тогда, когда Shutdown метод Application называется. Завершение работы может происходить неявно или явно, как указано значением ShutdownMode собственность.
A ShutdownMode of OnMainWindowClose заставляет WPF неявно вызывать завершение работы при закрытии главного окна, даже если другие окна в настоящее время открыты.
ShutdownMode можно настроить декларативно из XAML или программно из кода.
это свойство доступно только из потока, который создал
я рад, что вы получили свой ответ, но ради других я отвечу на ваш вопрос, а также, чтобы добавить некоторую информацию.
Шаг 1
во-первых, если вы хотите, чтобы ваша программа вышла, когда главное окно закрывается, вам нужно указать, так как это не WinForms, где это поведение по умолчанию.
(по умолчанию в WPF, когда последнее окно закрывается)
в XAML
если это работает, вы закончите, вы можете прекратить чтение.
Шаг 2
если вышеизложенное не сработало (я думаю, вы написали приложение WPF с нуля), главное окно, вероятно, не известно приложению как главное окно. Так что указать, что так же.
в XAML
альтернатива
я не думаю, что это лучший подход, просто потому, что WPF не хочет, чтобы вы это делали (так что у него есть Application ‘ s ShutdownMode ), но вы можете просто использовать событие / переопределить метод события (OnEventHappened).
потому что по умолчанию режим отключения в приложении WPF является OnLastWindowClose, что означает, что приложение останавливается при закрытии последнего окна.
обычно вы создадите объект window тем же методом, который будет вызывать его ShowDialog, и вы будете создавать новый объект window каждый раз, когда отображается диалоговое окно.
это похоже на то, с чем я столкнулся, когда создал второе окно, чтобы действовать как диалоговое окно. Когда второе окно было открыто, а затем закрыто, а затем Главное окно было закрыто, приложение продолжало работать (в фоновом режиме). Я добавил (Или подтвердил) следующее В своем приложении.язык XAML:
Итак, я, наконец, вошел в свое «главное окно».xaml «и добавил свойство» Closed » в окно, которое перешло к методу «MainWind_Closed», который выглядит как следующий:
у меня было «это.Close () «работает в методе, который закрыл диалоговое окно, и у меня был» dlgwin.Close ()», который пришел после » dlgwin.ShowDialog ()», и это не сработало. Даже не «dlgwin = null».
Итак, почему бы этому диалогу не закрыться без эти лишние вещи? Ну что ж. Эта работа.
это довольно мощные отношения, которые имеют ряд полезных преимуществ, которые вы не могли бы понять, чтобы начать с (предполагая, что вы не специально закодированы отдельные окна, чтобы избежать этих отношений).
если мы назовем ваше главное окно MainWindow и второе окно как AdditionalWindow затем.
одно следует отметить, хотя, если у вас есть эти отношения, то Closing событие AdditionalWindow не вызывается, поэтому вам придется вручную перебирать OwnedWindows коллекция. например, создайте способ вызова каждого окна через новый интерфейс или метод базового класса.
Пользователи взаимодействуют с приложениями Windows Presentation Foundation (WPF) с помощью окон. Основная цель окна — разместить содержимое, которое визуализирует данные и позволяет пользователям взаимодействовать с ними. Приложения WPF предоставляют собственные окна с помощью класса Window. Эта статья содержит ознакомительные сведения о Window, которые необходимо изучить прежде, чем приступать к созданию окон в приложениях и управлению ими.
Класс окна
В WPF окно инкапсулируется классом Window, который позволяет выполнять следующие задачи.
На следующем рисунке показаны составные части окна.
Окно разделено на две области: неклиентскую и клиентскую.
Неклиентская область окна реализуется WPF и включает части окна, которые являются общими для большинства окон, в том числе следующие:
Клиентская область окна находится внутри неклиентской области и используется разработчиками для добавления содержимого конкретного приложения, такого как строки меню, панели инструментов и элементы управления.
Реализация окна
Реализация типичного окна включает внешний вид и поведение. Внешний вид определяет, как окно отображается для пользователей, а поведение — функционирование окна при взаимодействии пользователей с ним. В WPF внешний вид и поведение окна можно реализовать с помощью кода или разметки XAML.
Однако обычно внешний вид окна реализуется с помощью разметки XAML, а его поведение — с помощью кода программной части, как показано в следующем примере.
Ниже представлен код программной части для XAML.
Чтобы разрешить совместную работу файла разметки XAML и файла кода программной части, необходимо следующее:
При создании нового класса Window для проекта с помощью Visual Studio классWindow реализуется с использованием разметки и кода программной части, а также включает в себя необходимую конфигурацию для создания связи между файлами разметки и кода программной части, как описано здесь.
При такой конфигурации можно сосредоточиться на определении внешнего вида окна в разметке XAML и реализации его поведения в коде программной части. Ниже представлен пример окна с кнопкой, которая определяет обработчик событий для события Click. Это реализуется в XAML, а обработчик — в коде программной части.
Ниже представлен код программной части для XAML.
Настройка окна для MSBuild
Реализация окна определяет его конфигурацию для MSBuild. Для окна, которое определяется с помощью разметки XAML и кода программной части:
Проекты MSBuild не будут автоматически импортировать типы, поэтому объявлять их следует самостоятельно:
Сведения о построении приложений см. в разделе Компиляция приложения WPF.
Время существования окна
Как и любой класс, окно имеет время существования, которое начинается с момента создания его экземпляра, после чего оно открывается, активируется/деактивируется и в конечном счете закрывается.
Открытие окна
Чтобы открыть окно, сначала создайте его экземпляр, как показано в следующем примере.
В этом примере экземпляр Window1 создается при запуске приложения, когда возникает событие Startup. Дополнительные сведения об окне запуска см. в разделе Получение или задание главного окна приложения.
При создании экземпляра окна ссылка на него автоматически добавляется в список окон, находящийся под управлением объекта Application. Первое окно, экземпляр которого создается, Application автоматически устанавливает в качестве главного окна приложения.
Наконец, окно открывается путем вызова метода Show, как показано на следующем изображении:
Окно, которое открывается путем вызоваShow, является безрежимным, и приложение не запрещает пользователям взаимодействовать с другими окнами в приложении. Метод ShowDialog открывает окно как модальное и запрещает взаимодействие пользователя с конкретным окном. Дополнительные сведения см. в разделе Общие сведения о диалоговых окнах.
При вызове Show перед своим отображением окно выполняет работу по инициализации, чтобы установить инфраструктуру, которая позволяет ему получать данные, вводимые пользователем. После инициализации окна возникает событие SourceInitialized и окно отображается.
Дополнительные сведения см. в разделе Открытие окна или диалогового окна.
Окно запуска
В предыдущем примере событие Startup использовалось для выполнения кода, отображающего начальное окно приложения. Вместо этого используйте команду StartupUri, чтобы указать путь к XAML-файлу в приложении. Приложение автоматически создает и отображает окно, указанное этим свойством.
Владение окном
Окно, открытое путем вызова метода Show, не имеет неявной связи с окном, создавшим его. Пользователи могут взаимодействовать с любым окном независимо от другого. Это означает, что любое из окон может выполнять следующие действия.
Для некоторых окон требуется связь с окном, которое их открывает. Например приложение IDE может открывать окна свойств и окна инструментов, типичное поведение которых заключается в том, чтобы перекрыть окно, которое их создает. Кроме того, такие окна должны всегда закрываться, сворачиваться, разворачиваться и восстанавливаться вместе с окном, которое их создало. Такую связь можно установить, сделав одно окно владельцем другого. Для этого устанавливается свойство Ownerокна во владении со ссылкой на окно-владелец. Это показано в следующем примере.
После установки владения:
Активация окна
При первом открытии окно становится активным. Активным окном является окно, которое в настоящий момент захватывает входные данные пользователя, например нажатие клавиш и щелчки мышью. Становясь активным, окно вызывает событие Activated.
При первом открытии окна события Loaded и ContentRendered запускаются только после запуска события Activated. С учетом этого окно может считаться открытым, если запущено событие ContentRendered.
После активизации окна пользователь может активировать другое окно в том же приложении или активировать другое приложение. В таком случае текущее активное окно становится неактивным и вызывает событие Deactivated. Аналогичным образом, когда пользователь выбирает неактивное окно, оно снова становится активным и запускается событие Activated.
Одна из распространенных причин обработки Activated и Deactivated — включение и отключение функций, которые могут выполняться, только если окно активно. Например, некоторые окна отображают интерактивное содержимое, которое требует постоянного ввода данных или внимания пользователя, включая игры и видеопроигрыватели. Ниже в качестве примера приведен упрощенный видеопроигрыватель, демонстрирующий обработку Activated и Deactivated для реализации этого повеления.
Ниже представлен код программной части для XAML.
Другие типы приложений могут выполнять код в фоновом режиме, когда окно деактивировано. Например, почтовый клиент может продолжать опрашивать почтовый сервер, пока пользователь работает с другими приложениями. Такие приложения часто обеспечивают другое или дополнительное поведение, когда главное окно не активно. В случае почтовой программы это может означать как добавление нового почтового элемента в папку «Входящие», так и добавление значка уведомления на панель задач. Значок уведомления должен отображаться только в том случае, если окно почты не активно. Это определяется путем проверки свойства IsActive.
Если фоновая задача завершается, окно может уведомить пользователя в более срочном порядке, вызвав метод Activate. Если пользователь взаимодействует с другим приложением, которое активно при вызове Activate, то кнопка панели задач окна мигает. Однако если пользователь взаимодействует с текущим приложением, вызов Activate перенесет окно на передний план.
Активировать область видимости приложения можно с помощью событий Application.Activated и Application.Deactivated.
Предотвращение активации окна
Существуют сценарии, в которых окна не должны активироваться при отображении, например окна сеанса обмена сообщениями в приложениях чатов или окна уведомлений приложения электронной почты.
Если приложение содержит окно, которое не должно активироваться при отображении, можно задать для его свойства ShowActivated значение false перед первым вызовом метода Show. Результат:
Однако окно активируется, если пользователь щелкнет его неклиентскую или клиентскую область. В данном случае:
Закрытие окна
Время существования окна заканчивается, когда пользователь его закрывает. После закрытия окна открыть его повторно нельзя. Окно может быть закрыто с помощью элементов в неклиентской области, включая следующие:
Можно указать дополнительные способы закрытия окна для клиентской области, к наиболее типичным из которых относятся следующие:
Чтобы закрыть окно одним из данных пользовательских способов, необходимо вызвать метод Close. В следующем примере реализуется возможность закрытия окна выбором пункта Выход в меню Файл.
Ниже представлен код программной части для XAML.
Приложение можно настроить на автоматическое завершение работы при закрытии главного окна приложения (см. MainWindow) или при закрытии последнего окна. Для получения дополнительной информации см. ShutdownMode.
Хотя окно может быть непосредственно закрыто с помощью механизмов, предоставляемых в неклиентской и клиентской областях, оно также может быть неявно закрыто в результате поведения в других частях приложения или Windows, включая следующее:
После закрытия окно нельзя открыть повторно.
Отмена закрытия окна
При закрытии окно запускает два события: Closing и Closed.
Closing вызывается перед закрытием окна и предоставляет механизм, с помощью которого можно предотвратить закрытие окна. Одна из распространенных причин, препятствующих закрытию окна, заключается в том, что содержимое окна содержит измененные данные. В этом случае событие Closing может быть обработано, чтобы определить наличие необработанных данных и запросить у пользователя, следует ли закрыть окно без сохранения данных или отменить закрытие окна. В следующем примере показаны ключевые аспекты обработки Closing.
Ниже представлен код программной части для XAML.
В обработчик событий Closing передается событие CancelEventArgs, реализующее свойство Cancel, для которого задается значение true с целью предотвратить закрытие окна.
Если событие Closing не обработано или обработано, но не закрыто, окно закроется. Непосредственно перед фактическим закрытием окна запускается Closed. На этом этапе невозможно предотвратить закрытие окна.
События времени существования окна
На следующем рисунке показана последовательность основных событий на протяжении времени существования окна.
На рисунке показана последовательность основных событий на протяжении времени существования окна, которое отображается без активации (ShowActivated установлен равным false до отображения окна).
Расположение окна
Когда окно открыто, оно располагается в координатах x и y относительно рабочего стола. Чтобы определить расположение, необходимо проверить свойства Left и Top соответственно. Задайте эти свойства, чтобы изменить расположение окна.
Можно также указать начальное расположение окна Window при первом появлении путем задания свойству WindowStartupLocation одного из следующих значений перечисления WindowStartupLocation:
Если расположение запуска указано как Manual, а свойства Left и Top не заданы, Window запросит у операционной системы расположение для отображения.
Окна верхнего уровня и Z-порядок
В каждом z-порядке активное в данный момент окно появляется поверх всех других окон в том же z-порядке.
Размер окна
Помимо расположения на рабочем столе, окно имеет размер, определяемый несколькими свойствами, включая различные свойства ширины и высоты и SizeToContent.
MinWidth, Width и MaxWidth используются для управления диапазоном значений ширины, которые может иметь окно на протяжении своего времени существования.
Так как различные значения ширины и высоты определяют диапазон, ширина и высота изменяемого окна могут находиться в любом месте указанного диапазона для соответствующего измерения. Чтобы определить текущую ширину и высоту, проверьте свойства ActualWidth и ActualHeight соответственно.
Если ширина и высота окна должны соответствовать размеру содержимого, можно использовать свойство SizeToContent, которое имеет следующие значения:
В следующем примере показано окно, размеры которого автоматически устанавливаются равными его содержимому по вертикали и по горизонтали при первом отображении.
В следующем примере показано, как установить свойство SizeToContent в коде, чтобы указать изменение размеров окна в соответствии с его содержимым.
Порядок приоритета для свойств размера
Различные свойства размеров окна объединяются для определения диапазона ширины и высоты окна изменяемого размера. Чтобы не выходить за рамки допустимого диапазона, Window оценивает значения свойств размера с использованием следующего порядка приоритета.
Для свойств высоты:
Для свойств ширины:
Порядок приоритетов также может определять размер окна, когда оно развернуто, что определяется с помощью свойства WindowState.
Состояние окна
В течение времени существования окна изменяемого размера оно может иметь три состояния: обычное, свернутое и развернутое. Окно с обычным состоянием является состоянием окна по умолчанию. Окно с этим состоянием позволяет пользователю перемещать его и изменять размер, используя захват для изменения размера или границу.
Окно с развернутым состоянием разворачивается до максимально возможного размера, который не может превышать значения свойств MaxWidth, MaxHeight и SizeToContent. Как и для свернутого окна, размер развернутого окна нельзя изменить с помощью захвата для изменения размера или перетаскивания границы.
Значения свойств окна Top, Left, Width и Height всегда представляют значения для обычного состояния, даже если окно в текущий момент развернуто или свернуто.
Состояние окна можно настроить путем задания его свойства WindowState, которое может иметь одно из следующих значений перечисления WindowState:
В следующем примере показано создание окна, которое отображается развернутым при его открытии.
В общем случае следует задать WindowState для настройки начального состояния окна. После отображения окна изменяемого размера пользователи могут нажимать кнопки свертывания, развертывания и восстановления на панели заголовка окна, чтобы изменить состояние окна.
Внешний вид окна
Можно изменить внешний вид клиентской области окна, добавляя в нее определенное содержимое, такое как кнопки, метки и текстовые поля. Для настройки неклиентской области Window предоставляет несколько свойств, в том числе Icon для задания значка окна и Title для задания его заголовка.
Можно также изменить внешний вид и поведение границы неклиентской области, настраивая режим изменения размера окна, стиль окна и отображение в виде кнопки на панели задач рабочего стола.
Режим изменения размера
Свойство WindowStyle позволяет разрешать или запрещать пользователям изменять размер окна, а также контролировать данный процесс. Стиль окна влияет на следующее:
Изменение размера окна можно настроить путем задания его свойства ResizeMode, которое может иметь одно из следующих значений перечисления ResizeMode:
Как и в случае WindowStyle, режим изменения размера окна редко изменяется на протяжении времени существования. Это означает, что, скорее всего, он устанавливается из разметки XAML.
Обратите внимание, что определить, развернуто, свернуто или восстановлено окно, можно путем проверки свойства WindowState.
Стиль окна
Граница, предоставляемая из неклиентской области окна, подходит для большинства приложений. Однако существуют ситуации, когда требуются различные типы границ либо границы вовсе не требуются, в зависимости от типа окна.
Для управления типом границы окна его свойству WindowStyle задается одно из следующих значений перечисления WindowStyle:
Эффект применения стиля окна показан на следующем рисунке:
Задать WindowStyle можно с помощью разметки XAML или кода. Поскольку он вряд ли изменится на протяжении времени существования окна, вы, скорее всего, настроите его с помощью разметки XAML.
Непрямоугольный стиль окна
В некоторых ситуациях стилей границы, которые предлагает WindowStyle, недостаточно. Например, можно создать приложение с непрямоугольной границей, такой, как используется проигрывателем мультимедиа Microsoft Windows.
Рассмотрим окно «облачко с текстом», показанное на следующем изображении.
Окно такого типа можно создать путем задания свойству WindowStyle значения None, а также использования поддержки прозрачности, предоставляемой Window.
Это сочетание значений указывает, что окно отрисовывается прозрачным. В этом состоянии кнопки оформления неклиентской области окна нельзя использовать, поэтому необходимо предоставить собственные.
Наличие панели задач
Внешний вид окна по умолчанию включает кнопку панели задач. У некоторых типов окон нет кнопки панели задач. К таким окнам относятся, например, окна сообщений, диалоговые окна или окна, у которых для свойства WindowStyle задано значение ToolWindow. Можно управлять отображением кнопки панели задач для окна, задав свойство ShowInTaskbar ( true по умолчанию).
Другие типы окон
NavigationWindow — это окно, предназначенное для размещения перемещаемого содержимого.
Диалоговые окна — это окна, которые часто используются для сбора информации от пользователя для выполнения функции. Например, когда пользователь хочет открыть файл, приложение отображает диалоговое окно Открыть файл, чтобы получить имя файла от пользователя. Дополнительные сведения см. в разделе Общие сведения о диалоговых окнах.