WinUI3 移除 TitleBar 控制項

筆者想要建立一個浮動按鈕視窗,讓他一直持續在螢幕上顯示,發現在 WinUI3 中使用 Popup 之類的元件都只能在 Window 中,無法超出視窗,看起來要達成最好的方式就是透過建立一個新的 Window ,不過一直無法讓上方的縮小、放大、關閉 這三個按鈕消失,就算使用 ExtendsContentIntoTitleBar 也是:
    
// 內容延伸到標題欄(不會有明顯的標題欄,但是還是會有右上角的三個按鈕)
this.ExtendsContentIntoTitleBar = true; 
    

下圖左側是一般執行畫面,右側是開啟 ExtendsContentIntoTitleBar

最後經過兩個多小時的研究,終於找到網路上大神提供的一個方法可以完全隱藏上方 TitleBar ,並且三個按鈕也不會出現,代價就是無法移動視窗(因為平時要移動需要使用滑鼠左鍵按住 TitleBar 並拖曳)和無法調整視窗大小
    
var windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(this);
Microsoft.UI.WindowId windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(windowHandle);
var appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);

var presenter = appWindow.Presenter as Microsoft.UI.Windowing.OverlappedPresenter;
if (presenter != null)
{
    presenter.IsResizable = false; 
    presenter.SetBorderAndTitleBar(false, false);
}
    

左側是上方程式碼執行結果,無法移動和調整視窗大小。
右側是沒有設定 IsResizable ,可以調整視窗大小,但是無法完全隱藏上方 TitleBar,加上 ExtendsContentIntoTitleBar 也不行

使用 WinUIEx 套件輕鬆解決

寫完這篇文章後筆者又繼續研究 WinUIEx 套件(此套件可以很簡單的把背景設為透明, 延伸閱讀: WinUI3 變更背景),結果發現只要安裝 WinUIEx 套件後,要移除 TitleBar 非常很簡單,就是設定視窗樣式即可:
    
// 沒有 TitleBar ,有正方形邊框
this.SetWindowStyle(WindowStyle.Border);

// 有 TitleBar ,但是沒有右上角三個按鈕
// 搭配 this.ExtendsContentIntoTitleBar = true;  可以完全隱藏 TitleBar ,會有圓角矩形邊框
this.SetWindowStyle(WindowStyle.Caption);

// 沒有 TitleBar 和邊框
this.SetWindowStyle(WindowStyle.Child);
    



延伸閱讀: C# WinUI 3 取得和設定畫面和元件的寬度與高度

參考資料:
Microsoft.Learn - OverlappedPresenter Class
Microsoft.Learn Q&A - WinUI3 : How to remove Min Max Close button with tittle bar customization
GitHub - castorix/WinUI3_SwapChainPanel_Layered
WinUIEx - OverviewWindow Extension Methods

留言