single.php

C# WinUI 3アプリで最小ウィンドウサイズを設定する方法

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトで、最小ウィンドウサイズを設定にする方法です。

この記事は、Microsoft公式ページの「XAMLスタイル」を参考に書いています。

SetPreferredMinSizeは使えない

Microsoft公式ページの「 クイック スタート: さまざまなウィンドウ サイズのアプリの設計」で勧められている「ApplicationView.SetPreferredMinSize(Size) メソッド」を参考にして、こんな感じでサイズを設定してみると

ApplicationView.GetForCurrentView().SetPreferredMinSize(new Size(640, 640));

実行時に[COMException]が発生してしまいます。

Win32:SetWindowPosで設定

やはり、困った時のWin32なので[SetWindowPos]で設定ができました。

ちょっと長いけれど、Win32を呼び出すための具体的なコードは、こんな感じ。

[DllImport("user32")]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwLong);
[DllImport("user32.dll")]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

private const uint SWP_NOMOVE = 0x0002;
private const uint SWP_NOZORDER = 0x0004;
private const uint SWP_NOACTIVATE = 0x0010;
private const uint SWP_SHOWWINDOW = 0x0040;

private const int GWL_STYLE = -16;
private const int WS_MINIMIZEBOX = 0x00020000;
private const int WS_MAXIMIZEBOX = 0x00010000;

SetWindowPosを使ってウィンドウサイズを変更する関数を作ります。

private void SetMinWindowSize(IntPtr hWnd, int minWidth, int minHeight)
{
  int style = GetWindowLong(hWnd, GWL_STYLE);
  SetWindowLong(hWnd, GWL_STYLE, style);

  SetWindowPos(hWnd, IntPtr.Zero, 0, 0, minWidth, minHeight, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE | SWP_SHOWWINDOW);
}

Xamlの[Window]タグに[SizeChanged]イベントを追加して、サイズ変更時のプロシージャを作成します。

[SizeChanged]イベントのプロシージャに、一定のサイズを超えたら、SetWindowPosを呼び出すコードを追加します。

private void Window_SizeChanged(object sender, Microsoft.UI.Xaml.WindowSizeChangedEventArgs args)
{
  if (args.Size.Width < 640)
  {
    IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
    SetMinWindowSize(hWnd, 640, 320);
  }
}

サンプルコードでは幅方向だけですが、同様に高さ方向も追加すれば、最小ウィンドウサイズが設定できました。

まとめ

今回は短い記事ですが、WinUI3プロジェクトで、Xamlで作成されるウィンドウの最小サイズを設定する方法を書きました。

[SetPreferredMinSize]メソッドがWinUI3プロジェクトでは実行時に例外エラーになってしまうため、SetWindowPosなどのWin32を使って設定ができました。

C#のWinUI 3アプリのウィンドウの最小サイズを設定したい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です