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

参考書

WinUI3

WinUI3でアプリを作ろうと思ったときのとっかかりによかった。 msdocsに書いてある情報を、体系的に、順番に読みたいな、というときによいかも。(ただし英語)
この本で分からなかった、かゆいところに手が届かなかった部分を私は記事にしてる感じ。

C#①

表紙に書いてある通り、教科書として最適。 これからC#を勉強したいけど、ネットだけで勉強するのは効率が悪いから体系的に学べる本が欲しいときや、 ちょっとC#を勉強してコード書けるようになったけど、もう少し広く深く知りたいなというときによいと思う。
私は仕事で触れるコードを軸に、基本ネットで断片的にC#を学んだので、その知識の隙間を埋めて枝葉を広げるためにとても分かりやすかった。

C#②

C#の文法的に色々できるのは分かったが、いざ実装するときに、わかったことを使ってどう実装すればいいのか?と悩んだときに指針になりそうな本。
「プロパティ等の名前の付け方、どうすればいい?」「情報をクラス外部に見せるときに、プロパティにすべき?メソッドにすべき?」「異常だと判定したいとき、どんなときにどんな例外をスローすべき?」などなど、勉強になる部分が山ほどあった。
私のように「コードは書くけどこれであってるのか自信がない、レビューで指摘されるのが嫌だ、実装時の(心の)よりどころが欲しい」という人に最適。