UWP на рабочем столе закрыт верхней кнопкой X - нет события
Приложение UWP, которое работает на рабочем столе, может быть закрыто с верхней кнопки X, но для него нет никакого события. Известно, что на телефонах и планшетах приложение должно полагаться на событие Suspending
, независимо от того, как оно срабатывает, а затем приложение должно полагаться на ApplicationExecutionState
.
Однако здесь есть (возможно) общий сценарий: на телефонах есть событие Suspending
, и в случае вызова Voip он будет управляться ОС после приостановки приложения. На рабочем столе пользователю закрывается кнопка закрытия, чтобы полностью закрыть приложение. Поэтому, если вызов продолжается, его следует повесить, а некоторые ресурсы должны быть освобождены.
Как узнать, когда пользователь нажал кнопку "закрыть", если (и только если) приложение UWP запущено на рабочем столе?
Ответы
Ответ 1
ограниченная возможность confirmAppClose
была добавлена в Windows 10 версии 1703 (сборка 10.0.15063), чтобы предоставить приложениям возможность перехватывать закрытие окна.
Пространство имен манифеста:
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
Manifest:
<Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="confirmAppClose"/>
</Capabilities>
Требуется дополнительное одобрение при отправке в магазин. Но затем сработает событие CloseRequested
для экземпляра SystemNavigationManagerPreview.
Код:
public MainPage()
{
this.InitializeComponent();
SystemNavigationManagerPreview.GetForCurrentView().CloseRequested += this.OnCloseRequest;
}
private void OnCloseRequest(object sender, SystemNavigationCloseRequestedPreviewEventArgs e)
{
if (!saved) { e.Handled = true; SomePromptFunction(); }
}
Вы можете получить отсрочку, чтобы выполнить небольшую работу здесь (сохранить или запросить), или вы можете установить Handled
в значение true, чтобы остановить закрытие окна (запрос отменен пользователем).
Ответ 2
От официальной страницы о жизненном цикле приложения:
Нет специального события, указывающего, что пользователь закрыл приложение.
Поведение по отдельности: если вашему приложению нужно делать что-то другое, когда оно закрыто пользователем, чем когда оно закрыто Windows, вы можете использовать обработчик события активации, чтобы определить, было ли приложение прекращено пользователем или Windows.
Таким образом, в соответствии с этим существует no (clear) способ узнать, закрыл ли пользователь приложение до закрытия приложения, но только после его перезапуска. Слишком плохо.
Ответ 3
Я удалил свой оригинальный ответ Window.Current.Closed, потому что он не работает, если у вас есть только один экземпляр Window, Существует также CoreApplication.Exiting
, но, судя по этой теме, он тоже не работает. Кажется, это известная проблема, которая может быть исправлена в будущем. В конце, похоже, нет четкого способа определить, когда приложение закрывается, только когда оно приостановлено.
Однако, когда приложение закрыто, Window.Current
запускает VisibilityChanged. Проблема в том, что она также запускается, когда приложение сведено к минимуму и, возможно, в некоторых других случаях. Но я думаю, что в сочетании с Suspending
вы можете (более или менее) безопасно определить, что настольное приложение закрывается. Хорошо, VisibilityChanged
уволен до Suspending
, и вы можете сохранить его значение и проверить его в обработчике OnSuspending
, после чего решите, нужно ли выполнять любую очистку или другую работу.
Ответ 4
Этот код поможет вам -
В App.xaml.cs
...
using Windows.ApplicationModel;
...
public App()
{
InitializeComponent();
this.Suspending += OnSuspending;
}
...
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
//Add your logic here, if any
deferral.Complete();
}
Спасибо !!!