web-dev-qa-db-ja.com

トップXボタンで閉じられたデスクトップのUWP-イベントなし

デスクトップで実行されるUWPアプリは、上部のXボタンから閉じることができますが、そのためのイベントはありません。スマートフォンやタブレットでは、どのようにトリガーされても、アプリはSuspendingイベントに依存する必要があり、アプリは ApplicationExecutionState に依存する必要があります。

ただし、これは(たぶん)一般的なシナリオです。電話ではSuspendingイベントで十分であり、Voip通話が発生している場合は、アプリが中断された後にOSによって操作されます。 デスクトップでは、ユーザーが閉じるボタンでアプリを完全に閉じることが期待されています。通話が続いている場合は、電話を切って特定のリソースをリリースする必要があります。

UWPアプリがデスクトップで実行されている場合(およびその場合に限り)、ユーザーが「閉じる」ボタンをクリックしたことをどのようにして知ることができますか?

18
tomab

A 制限された機能confirmAppCloseは、Windows 10バージョン1703(ビルド10.0.15063)でウィンドウのクローズをインターセプトする機能をアプリに提供するために追加されました。

マニフェスト名前空間:

xmlns:rescap="http://schemas.Microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"

マニフェスト:

<Capabilities> 
  <Capability Name="internetClient" /> 
  <rescap:Capability Name="confirmAppClose"/> 
</Capabilities> 

ストアに提出する場合、追加の承認が必要です。しかし、次に SystemNavigationManagerPreview インスタンスでCloseRequestedイベントを発生させます。

コード:

    public MainPage()
    {
        this.InitializeComponent();
        SystemNavigationManagerPreview.GetForCurrentView().CloseRequested += this.OnCloseRequest;
    }

    private void OnCloseRequest(object sender, SystemNavigationCloseRequestedPreviewEventArgs e)
    {
        if (!saved) { e.Handled = true; SomePromptFunction(); }
    }

ここで少し作業を行うために延期を取得するか(保存またはプロンプト)、またはウィンドウを閉じるのを停止するためにHandledをtrueに設定できます(ユーザーがプロンプトをキャンセルしました)。

12

公式から ページ アプリのライフサイクルについて:

ユーザーがアプリを閉じたことを示す特別なイベントはありません。

ユーザーが閉じる動作:アプリがユーザーによって閉じられたとき、Windowsによって閉じられたときとは異なる動作をする必要がある場合、アクティベーションイベントハンドラーを使用して、アプリがユーザーによって終了されたかWindowsによって終了されたかを判断できます。 。

したがって、これによると、ユーザーがアプリを閉じる前にユーザーがアプリを閉じたかどうかを確認する(= /// =)方法はありません。残念な。

4
tomab

このコードはあなたを助けます-

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

ありがとう!!!

1
Nitika Chopra

Window.Current.Closed イベントで元の回答を削除しました。これは、Windowインスタンスが1つしかない場合は機能しないようです。もあります CoreApplication.Exiting、しかし this トピックで判断しても機能しません。将来修正される可能性のある既知の問題のようです。結局のところ、アプリがいつ閉じられるかを判断する明確な方法はなく、一時停止されている場合に限られます。

しかしながら、 Window.Currentはアプリを閉じたときに VisibilityChanged イベントを発生させます問題は、アプリが最小化されたときや、場合によっては他の場合にも発生します。しかし、Suspendingと組み合わせれば、デスクトップアプリが閉じていることを(多かれ少なかれ)安全に判断できると思います。良いことは、VisibilityChangedSuspendingの前に起動され、その値を保存してOnSuspendingハンドラーで確認できることです。その後、クリーンアップやその他の作業を行う必要があるかどうかを判断します。

1