MAUI 桌面端標題欄設定與視窗調整

MAUI 桌面端標題欄設定與視窗調整

如果你現在開始學習並使用 MAUI 開發桌面端,那麼接下來的問題相信你都會遇到,並且會想著嘗試找方法解決它。

最後更新 2023/2/7 下午12:22
智州Ryan
預計閱讀 4 分鐘
分類
MAUI
標籤
.NET MAUI

本文由網友投稿。

作者:智州 Ryan

原文標題:MAUI 桌面端標題列設定與視窗調整

原文連結:https://blog.csdn.net/Sir_aligaduo/article/details/128880940

寫在前面

如果你現在開始學習並使用 MAUI 開發桌面端,那麼接下來的問題相信你都會遇到,並且會想嘗試找方法解決它。

問題

本人在使用目前 VS2022 最新版 17.4 Professional 版建立新的 MAUI APP 基於 .NET6.0 專案時,發現完全找不到跟 WPF 一樣的 WindowStyleResizeMode 這樣的屬性,有點強迫症,一定要把這個標題列去掉,想著應該不難,但是資料太少了,文件寫得也很亂,根本無法對應到這個。找著找著,加到了 Dotnet9 網站站長,在他耐心的幫忙下,我解決了這個問題,所以特別感謝 Dotnet9 網站站長 風中一匹狼!

MAUI 自帶的 Windows 下的視窗是這樣的(完全不在我審美上):

解決方法

一開始,我是根據站長網站裡提供的方法,連結:Maui 學習之路(1)-Windows 表單設定 嘗試解決該問題。

雖然能正常根據裡面操作了,但是我在操作的時候可能是我操作的問題,老是實現不了,只把標題列跟下面的 content 融在一起,標題列還是在那,而且我不好改顏色。

加了站長微信,站長耐心地幫我找了大佬 Chister.Wu 的 Demo,對照他的 Demo 終於是把這個問題解決了,現在總結下去掉原始標題列的方法。

  1. 完美去掉標題列,下面是程式碼,寫在 MauiProgram.cs 裡設定生命週期方法,具體的資料在上面的連結:Maui 學習之路(1)-Windows 表單設定 裡也有,但是看起來比較麻煩,直接看程式碼可能好理解一點:
var builder = MauiApp.CreateBuilder();
builder.UseMauiApp<App>()
		.ConfigureFonts(fonts =>
		{
			fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
			fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
		})
		.ConfigureLifecycleEvents(events =>
         {

#if WINDOWS
        events.AddWindows(windows => windows
        .OnWindowCreated(window =>
                      {
                          //window.SizeChanged += OnSizeChanged;
                          MauiWinUIWindow mauiwin = window as MauiWinUIWindow;
                          if (mauiwin == null) { return; }

                          //關閉擴充內容
                          mauiwin.ExtendsContentIntoTitleBar = false;
                          mauiwin.Title = "Hello Maui";


                          //透過MAUI視窗句柄取得AppWindow
                          ///這裡有個麻煩的東西,我用最新版新建的專案無法直接getappwindow,所以用了文章裡的方法
                          var wndId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(mauiwin.WindowHandle);
                          Microsoft.UI.Windowing.AppWindow appwin = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(wndId);

                          //對於OverlappedPresenter的解釋文件在這個網址
                          //https://learn.microsoft.com/zh-tw/windows/windows-app-sdk/api/winrt/microsoft.ui.windowing.overlappedpresenter?view=windows-app-sdk-1.2

                          //大致就是OverlappedPresenter會設定這個視窗,這個視窗可以和其他視窗重疊,並對視窗標題列、狀態列、工作列進行設定,以及其他一些調整視窗的操作
                          var customOverlappedPresenter = Microsoft.UI.Windowing.OverlappedPresenter.CreateForContextMenu();
                          appwin.SetPresenter(customOverlappedPresenter);
                      }));
#endif
            });

        return builder.Build();

原理就是重寫建立視窗的方法,在這裡重寫有個好處,視窗載入之後會重新整理,我在 Mainpage.cs 下寫 Loaded 的方法的話雖然標題列的按鈕去掉了,但是標題列那塊並沒有去掉,把站長的文章和 Demo 給的結合起來才實現了這樣的效果。

效果圖如下,完美去掉了:

  1. 直接在 MainPage 裡寫 Loaded 方法,這也是一開始我用的方法,程式碼如下:
private void ContentPage_Loaded(object sender, EventArgs e)
    {

#if WINDOWS
        var winuiWindow = Window.Handler?.PlatformView as  Microsoft.UI.Xaml.Window;
		MauiWinUIWindow maui = winuiWindow as MauiWinUIWindow;

        winuiWindow.ExtendsContentIntoTitleBar = false;
        if (winuiWindow is null)
            return;

		var wndId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(maui.WindowHandle);
        Microsoft.UI.Windowing.AppWindow appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(wndId);
        //var appWindow = maui.GetAppWindow();
        if (appWindow is null)
            return;

        var customOverlappedPresenter =  Microsoft.UI.Windowing.OverlappedPresenter.CreateForContextMenu();
        appWindow.SetPresenter(customOverlappedPresenter);
#endif
    }

缺點就是她會有一個類似 WPF 的 captionheight 標題列那樣的東西,檢視未完全重新整理。

以上就是去標題列的方法,想要程式碼的可以去 Gitee 上自己下載,連結:maui-title-handle-demo

另外對於後續視窗的大小調整,自訂放大縮小按鈕可以參考 MauiDemo,注意一定要看清楚自己的專案設定。

參考文章:

參考 Demo

MauiDemo

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2023/1/12

Maui Blazor 使用攝影機實現

由於 Maui Blazor 中界面是由 WebView 渲染,所以在使用 Android 的攝影機時無法獲取,因為原生的攝影機需要綁定界面元件

繼續閱讀