WinUI3アプリのウインドウのタイトルバーを消す

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

やりたいこと

WInUI3アプリのウインドウの、タイトルバーをなくしたい。

前提

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

やりかた

OverlappedPresenterSetBorderAndTitleBar()メソッドを使う。

サンプルコード

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

流れとしては、

  • OverlappedPresenterをCreateする。
  • OverlappedPresenterインスタンスSetBorderAndTitleBar()で、第二引数のhasTitleBarをfalseにして呼ぶ。
  • AppWindowに、OverlappedPresenterインスタンスをセットする。

という感じ。

using Microsoft.UI.Windowing;
using Microsoft.UI.Xaml;
using System;

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

            var op = OverlappedPresenter.Create();
            op.IsResizable = false;
            op.IsAlwaysOnTop = false;
            op.SetBorderAndTitleBar(true, false); //★ココ

            m_AppWindow.SetPresenter(op);
        }
    }
}

これを実行すると下図のようなタイトルバーのないウインドウが出てくる。

備考

op.SetBorderAndTitleBar(true, false);について、
私が試した限り、第一引数のhasBorderをfalseにして呼ぶと、ArgumentExceptionが出てしまう。

もしかしたら、OverlappedPresenter以外のPresenter(CompactOverlayPresenterとか)だとうまくうごくのかもしれないが、今回は試さず。

参考

OverlappedPresenter.SetBorderAndTitleBar(Boolean, Boolean) Method

https://docs.microsoft.com/en-us/windows/windows-app-sdk/api/winrt/microsoft.ui.windowing.overlappedpresenter.setborderandtitlebar?view=windows-app-sdk-1.1