如何在.NET MAUI应用中禁用或移除最小化、还原及关闭按钮?
在.NET MAUI中禁用/移除窗口的最小化、还原及关闭按钮
由于.NET MAUI是跨平台框架,窗口标题栏按钮的控制需要针对不同平台编写平台特定代码,之前参考的窗口尺寸设置方案仅负责调整窗口大小,和标题栏按钮控制属于完全不同的API范畴,因此无法生效。以下是各桌面平台的实现方案:
Windows平台(WinUI3)
方式1:隐藏标题栏按钮
通过WinUI3的AppWindow API直接隐藏所有标题栏按钮:
#if WINDOWS using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Windowing; using WinRT.Interop; #endif protected override void OnAppearing() { base.OnAppearing(); #if WINDOWS var mauiWindow = Application.Current.Windows.First(); var winuiWindow = mauiWindow.Handler.PlatformView as Window; var hWnd = WindowNative.GetWindowHandle(winuiWindow); var windowId = Win32Interop.GetWindowIdFromWindow(hWnd); var appWindow = AppWindow.GetFromWindowId(windowId); // 隐藏最小化、最大化、关闭按钮 appWindow.TitleBar.ButtonVisibility = TitleBarButtonVisibility.Collapsed; #endif }
方式2:禁用按钮(保留样式但不可点击)
如果需要保留按钮样式但禁用功能,可调用Win32 API修改窗口样式:
#if WINDOWS using System.Runtime.InteropServices; #endif // 定义Win32 API #if WINDOWS [DllImport("user32.dll")] private static extern int GetWindowLong(IntPtr hWnd, int nIndex); [DllImport("user32.dll")] private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); private const int GWL_STYLE = -16; private const int WS_MINIMIZEBOX = 0x00020000; private const int WS_MAXIMIZEBOX = 0x00010000; private const int WS_SYSMENU = 0x00080000; // 关闭按钮属于系统菜单 #endif protected override void OnAppearing() { base.OnAppearing(); #if WINDOWS var mauiWindow = Application.Current.Windows.First(); var winuiWindow = mauiWindow.Handler.PlatformView as Window; var hWnd = WindowNative.GetWindowHandle(winuiWindow); var currentStyle = GetWindowLong(hWnd, GWL_STYLE); // 移除最小化、最大化、系统菜单权限 SetWindowLong(hWnd, GWL_STYLE, currentStyle & ~WS_MINIMIZEBOX & ~WS_MAXIMIZEBOX & ~WS_SYSMENU); #endif }
Mac Catalyst平台
通过AppKit的NSWindow API修改窗口样式,实现按钮的隐藏或禁用:
#if MACCATALYST using AppKit; using UIKit; #endif protected override void OnAppearing() { base.OnAppearing(); #if MACCATALYST var uiWindow = UIApplication.SharedApplication.Windows.First(); var nsWindow = uiWindow.WindowScene?.Window as NSWindow; if (nsWindow == null) return; // 禁用最小化、最大化、关闭按钮 nsWindow.StyleMask &= ~NSWindowStyle.Resizable; // 禁用还原/最大化 nsWindow.StyleMask &= ~NSWindowStyle.Miniaturizable; // 禁用最小化 nsWindow.StyleMask &= ~NSWindowStyle.Closable; // 禁用关闭 // 可选:隐藏标题栏(连按钮一起隐藏) // nsWindow.TitleVisibility = NSWindowTitleVisibility.Hidden; // nsWindow.TitlebarAppearsTransparent = true; #endif }
注意:移动平台(Android/iOS)没有传统的窗口标题栏按钮,因此无需处理。
内容的提问来源于stack exchange,提问作者Gajendra Singh
相关产品推荐
相关产品推荐

