Как перезапустить приложение wpf
Свойство ShutdownMode указывает на способ выхода из приложения и может принимать одно из следующих значений:
OnMainWindowClose : приложение работает, пока открыто главное окно
OnLastWindowClose : приложение работает, пока открыто хотя бы одно окно
OnExplicitShutdown : приложение работает, пока не будет явно вызвано Application.Shutdown()
Задать свойство ShutdownMode можно в коде xaml:
либо определить в App.xaml.cs:
События приложения
Класс Application определяет ряд событий, который могут использоваться для всего приложения:
Activated : происходит, когда активизируется одно из окон приложения
Deactivated : возникает при потере окном фокуса
SessionEnding : происходит при завершении сеанса Windows при перезагрузке, выключении или выходе из системы текущего пользователя
DispatcherUnhandledException : возникает при возникновении необработанных исключени
LoadCompleted : возникает при завершении загрузки приложения
Exit : возникает при выходе из приложения Это может быть закрытие главного или последнего окна, метод Application.Shutdown() или завершение сеанса
Так же, как и для элементов, обработчики события определяются для одноименных атрибутов в разметке xaml. Например, обработаем событие Startup:
Затем в файле связанного кода App.xaml.cs пропишем обработчик события:
В результате при запуске каждой новой копии данного приложение обработчик события будет определять, запущена ли уже приложение, и если оно запущено, то данная копия завершит свою работу.
Создание заставки приложения
Приложения бывают разные, одни открываются быстро, другие не очень. И чтобы пользователя как-то известить о том, что идет загрузка приложения, нередко используют заставку или сплеш-скрин. В WPF простые заставки на основе изображений очень легко сделать. Для этого добавьте в проект какое-нибудь изображение и после добавления установите для него в окне Properties (Свойства) для свойства BuildAction значение SplashScreen . И после запуска до появления окна приложения на экране будет висеть изображение заставки.
Обращение к текущему приложению
Мы можем обратиться к текущему приложению из любой точки данного приложения. Это можно сделать с помощью свойства Current , определенном в классе Application. Так, изменим код нажатия кнопки на следующий:
@Cody Gray Теперь я снова вызываю те методы, которые вызывают на звезду приложения. Он работает хорошо. Но для другого приложения я должен перезапустить приложение. – Hooch
@Cody Grey Почему вы говорите, что этого никогда не нужно? Существует множество причин, по которым приложение может потребоваться перезапустить, зачем заставить пользователя повторно запускать исполняемый файл, когда вы можете сделать это для них? – epalm
ответ
Я нашел это: Он работает. Но. Есть ли лучший способ?
Сохраняет ли это аргументы командной строки !? –
@ AndreiRinea No. Но просто сохраните их при запуске и передайте их в качестве аргументов для вызова этой функции. Это просто. – Hooch
Я использовал это в WPF, успешно:
Я думаю, что это немного перебор, чтобы включить ссылку на сборку WinForms только для этого. –
@commanderz Я склонен согласиться, однако я уже использую магию WinForms, например 'System.Windows.Forms.FolderBrowserDialog()' в том же проекте. – epalm
@ MatějZábský Это даже необходимо при использовании ClickOnce. – John
Эти предлагаемые решения могут работать, но, как другой комментатор отметил, что они чувствуют себя вроде как быстро взломать. Другой способ сделать это, который немного чище, - запустить пакетный файл, который включает задержку (например, 5 секунд), чтобы дождаться завершения текущего (закрывающего) приложения.
Это предотвращает одновременное открытие двух экземпляров приложения. В моем случае его недействительность для двух экземпляров приложения должна быть открыта одновременно - я использую мьютекс, чтобы убедиться, что открыто только одно приложение - из-за приложения, использующего некоторые аппаратные ресурсы.
Пример окна пакетного файла ("restart.bat"):
И в приложении WPF, добавьте этот код:
Написание командного файла со сном просто похоже на длинный хак, но, возможно, еще хуже. – Philliproso
@Philliproso согласился, это взломать, в то время мне нужен совершенно новый процесс Windows для перезапускаемого приложения, которое другие методы здесь, я считаю, не предоставляют, но это делает. –
В моей программе у меня есть мьютекс, чтобы обеспечить только один instan ce приложения, запущенного на компьютере. Это привело к тому, что вновь запущенное приложение не запускалось, потому что мьютекс не был выпущен своевременно. В результате я поместил значение в Properties.Settings, который указывает, что приложение перезагружается. Перед вызовом Application.Restart() значение Properties.Settings установлено равным true. В Program.Main() я также добавил проверку для этого конкретного значения property.settings, так что когда true, он сбрасывается на false и появляется Thread.Sleep (3000);
В вашей программе вы можете иметь логику:
Этот ответ (помеченный как ответ) вводит в заблуждение. Первоначальный вопрос состоял в том, чтобы перезапустить приложение WPF, очень похожее на то, как это было сделано в WinForms.К сожалению, ваш ответ по-прежнему использует перезапуск WinForms (то, что недоступно в WPF), а также содержит примеры, которые не имеют отношения к заданному вопросу (например, Mutex?). – Crypton
Может быть, ввести в заблуждение WPF-Only ответ, но полезный в сочетании с другими ответами для меня, потому что мне нужно было перезапустить WPF, который использует мьютекс. Это делает работу. – sgissinger
В 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
Это традиционный подход — приложение остается активным только пока открыто главное окно
Горячая перезагрузка позволяет вносить изменения в исходный код приложения во время его выполнения без необходимости приостанавливать его вручную или создавать точку останова. Теперь прямо во время работы приложения можно внести в код изменение из числа тех, что поддерживаются для горячей перезагрузки, нажать кнопку «Применить изменения кода» в новом интерфейсе Visual Studio — и изменение будет сразу же применено.
Мы стремились сделать горячую перезагрузку доступной независимо от того, как вы предпочитаете запускать свои приложения. Представленную сегодня версию можно использовать в отладчике Visual Studio, с которым она полностью интегрирована, а также через командную строку ( dotnet watch ). В следующих выпусках появятся и другие варианты.
Начало работы
Visual Studio
Использование горячей перезагрузки в Visual Studio при работе с отладчиком:
Скачайте и установите Visual Studio 2019 16.11 (предварительная версия 1).
Откройте проект поддерживаемого типа, например приложение WPF.
Запустите приложение с подключенным отладчиком клавишей F5 (удостоверьтесь, что параметр «Разрешить отладку машинного кода» в настройках/профиле запуска отладчика отключен).
Примените изменения кода с помощью новой кнопки Применить изменения кода (ALT + F10) на панели инструментов Visual Studio (рядом с кнопкой Продолжить). Сохранять файлы при использовании Visual Studio не нужно — можно быстро внести в код изменение и двигаться дальше.
Если внесенное изменение поддерживается, обновленная логика будет применена к запущенному приложению, и вы увидите изменения в его работе при следующем выполнении обновленного кода (по действию или при выполнении активирующего условия, например по таймеру).
Интерфейс командной строки (CLI)
Использование горячей перезагрузки из командной строки при запуске приложения с помощью dotnet watch:
Добавьте свойство " hotReloadProfile ": " aspnetcore " в профиль запуска приложения ( launchSettings.json ).
Пример файла Properties/launchSettings.json :
Запустите проект с помощью команды dotnet watch и убедитесь, что в выводе указано, что горячая перезагрузка активирована.
Внесите в управляемый исходный код приложения поддерживаемое изменение и сохраните файл, чтобы применить это изменение.
Как и в Visual Studio, с этого момента начнет применяться новая логика: при следующем выполнении обновленного кода вы увидите изменения в работе приложения.
Этот же подход можно использовать с проектами Blazor WebAssembly: следует изменить профиль горячей перезагрузки blazorwasm и далее действовать, как описано выше. Можно попробовать его даже с Windows Forms и другими типами проектов на платформе CoreCLR: для этого вручную добавьте в папку Properties файл с именем launchSettings.json и тем же содержимым, что в предыдущем примере.
Примеры ниже позволяют составить представление о том, какие возможности мы планируем реализовать в будущих предварительных выпусках и окончательной версии:
Работа в Visual Studio без отладчика. В будущем выпуске Visual Studio 2022 мы планируем добавить поддержку горячей перезагрузки без отладчика. Это значит, что даже при запуске приложения сочетанием клавиш CTRL + F5 разработчики смогут вносить изменения в выполняемое приложение.
Таковы планы на данный момент. Они не окончательные: мы будем прислушиваться к отзывам пользователей и ориентироваться на график выпусков.
Поддерживаемые и неподдерживаемые изменения и языки
Нам важны ваши отзывы
Конечно, в этой ранней предварительной версии будут ошибки. Иногда при попытке применить изменение ничего не будет происходить, иногда возможно аварийное завершение приложения и т. п. Если вы столкнетесь с какими-либо проблемами, сообщите нам о них — это не займет много времени. Ваша поддержка поможет нам эффективно устранить критические проблемы и определить приоритеты для дальнейшей работы.
Также приглашаем всех желающих на открытый урок «Управление конфигурациями микросервисов». На занятии обсудим один из подходов, используемых в реальных high-load проектах.
Читайте также: