WinUI3アプリのウインドウの大きさや位置が変化したイベントと、変化したときの大きさや位置の値を取りたい

もくじ
https://tera1707.com/entry/2022/02/06/144447#WinUI3

やりたいこと

WInUI3アプリのウインドウの、大きさや位置が変化したイベントと、変化したときの大きさや位置の値を取りたい。

前提

  • VisualStudio2022 Community 17.3.0
  • WinUI3 と パッケージプロジェクト
  • Windows App SDK 1.1.3

やりかた

AppWindowChangedイベントを使う。

サンプルコード

以前調べた、AppWindowクラスを使ってウインドウを制御するやり方を元に作る。

流れとしては、

  • AppWindowをとる
  • AppWindowのChangedイベントに、(AppWindow sender, AppWindowChangedEventArgs args)の引数をもつイベントハンドラをセットする
  • イベント内で、
    • サイズ変更を取りたいときは、AppWindowChangedEventArgsDidSizeChangeがtrueだったら、AppWindowSizeを見る
    • 位置変更を取りたいときは、AppWindowChangedEventArgsDidPositionChangeがtrueだったら、AppWindowPositionを見る
using Microsoft.UI.Windowing;
using Microsoft.UI.Xaml;
using System;
using System.Diagnostics;

namespace App17
{
    public sealed partial class MainWindow : Window
    {
        private AppWindow m_AppWindow;

        public MainWindow()
        {
            this.InitializeComponent();

            IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
            Microsoft.UI.WindowId windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(hWnd);
            m_AppWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);

            m_AppWindow.Changed += M_AppWindow_Changed;  // ★ココ
        }

        private void M_AppWindow_Changed(AppWindow sender, AppWindowChangedEventArgs args)
        {
            // サイズと位置の値は、dpiが100%でないときも、100%のときのサイズと位置の値を返す様子。
            // 100%のときに1920*1080のモニタを使ってたら、サイズをモニタ目いっぱいにすると、Width=1920、Height=1080が取れる。
            if (args.DidSizeChange)
            {
                Debug.WriteLine($"サイズ:({sender.Size.Width}, {sender.Size.Height})"); 
            }
            else if (args.DidPositionChange)
            {
                Debug.WriteLine($"位置:({sender.Position.X}, {sender.Position.Y})");
            }
        }
    }
}