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();
}

Спасибо !!!