dullwhaleのメモ帳

何度も同じことを調べなくてよいように...

Windows App SDK(WinUI3)でウィンドウを閉じられてもアプリケーションを動かし続ける

Window.Closedにイベントハンドラを追加し、そのイベントハンドラ内で引数として渡されたイベントのHandledプロパティをtrueに設定すればよい。

Windows App SDKのイベントの仕組み

Windows App SDKのイベント処理の仕組みは、Webフロントエンドのそれと似ている。

ここでは説明のため、一旦JavaScriptを考える。 同じイベントをlistenする複数のイベントハンドラが登録されている状況を想像せよ。 例えば<div>要素の中に<button>があり、それぞれclickイベントに対するハンドラが設定されているとする。 この状況でbuttonを押すと、通常は次の順番で両方のハンドラが呼び出される。

  1. buttonのclickイベントのハンドラ
  2. divのclickイベントのハンドラ

ところが、buttonのイベントハンドラ内でイベントを完全にconsumeして、div要素へのイベントの伝播を阻止することもできる。 詳しくはイベントバブリングやイベントプロパゲーションで調べよ。

話をWindows App SDKに戻す。 恐らくWindowベースclassのClosedイベントに反応するハンドラとして、「他にactiveなウィンドウが存在しなければアプリケーションを終了する」という処理が登録されている。 これを阻止するためには、同様にClosedイベントへ反応する優先度の高いハンドラを追加し、そのハンドラ内でイベントの伝播を止めてしまえばよい。 例えば、以下のようなコードが考えられる。

// Closedイベントに反応するイベントハンドラを追加
Window.Closed += (sender, args) =>
{
  // trueを設定することで、イベントの伝播を阻止。
  args.Handled = true;
};
コード中の`Window`は実際には継承したクラス/インスタンス名になる。
テンプレートから名前を変更していない場合は`MainWindow`だろう。