You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI Windows平台:如何禁用窗口调整及配置窗口参数?

MAUI WinUI 窗口控制解决方案

以下是实现你需求的完整代码及说明,基于你提供的App类修改:

using Microsoft.UI.Xaml;
using Microsoft.UI.Windowing;
using Windows.Graphics;

namespace FigureCollapse.WinUI
{
    public partial class App : MauiWinUIApplication
    {
        public App()
        {
            AppData.AsignAppData(ApplicationData.Current.LocalFolder.Path, true);
            Lang.SelectAppLang(AppData.AppConfig["Language"]);

            this.InitializeComponent();
            this.WindowCreated += OnWindowCreated;
        }

        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();

        private void OnWindowCreated(object sender, WindowCreatedEventArgs args)
        {
            var window = args.Window;
            var appWindow = GetAppWindowForWindow(window);
            
            if (appWindow == null) return;

            // 读取配置项
            var resolutionConfig = AppData.AppConfig["Resolution"];
            var isFullscreen = bool.Parse(AppData.AppConfig["IsFullscreen"]);
            var windowSize = ParseResolution(resolutionConfig);

            // 禁用最大化/最小化按钮 + 禁止调整窗口大小
            appWindow.TitleBar.IsMaximizeButtonEnabled = false;
            appWindow.TitleBar.IsMinimizeButtonEnabled = false;
            appWindow.ResizeMode = ResizeMode.NoResize;

            if (isFullscreen)
            {
                // 切换至全屏模式
                appWindow.SetPresenter(AppWindowPresenterKind.FullScreen);
            }
            else
            {
                // 设置窗口尺寸并居中
                appWindow.Resize(windowSize);
                CenterWindow(appWindow);
            }
        }

        // 获取WinUI AppWindow实例
        private AppWindow GetAppWindowForWindow(Window window)
        {
            if (window.Content is FrameworkElement rootElement)
            {
                var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(window);
                return AppWindow.GetFromWindowId(Win32Interop.GetWindowIdFromWindow(hwnd));
            }
            return null;
        }

        // 解析分辨率字符串(格式:宽度x高度,如"1920x1080")
        private SizeInt32 ParseResolution(string resolutionStr)
        {
            var parts = resolutionStr.Split('x');
            if (parts.Length == 2 && int.TryParse(parts[0], out int width) && int.TryParse(parts[1], out int height))
            {
                return new SizeInt32(width, height);
            }
            // 解析失败时返回默认尺寸
            return new SizeInt32(1280, 720);
        }

        // 将窗口居中显示
        private void CenterWindow(AppWindow appWindow)
        {
            var displayArea = DisplayArea.GetFromWindowId(appWindow.Id, DisplayAreaFallback.Primary);
            if (displayArea != null)
            {
                var windowSize = appWindow.Size;
                var centeredPos = new PointInt32(
                    (displayArea.WorkArea.Width - windowSize.Width) / 2,
                    (displayArea.WorkArea.Height - windowSize.Height) / 2
                );
                appWindow.Move(centeredPos);
            }
        }
    }
}

功能实现细节

  • 禁止调整窗口大小:通过appWindow.ResizeMode = ResizeMode.NoResize直接禁用窗口拖拽缩放功能,这是WinUI 3中控制窗口可调整性的原生API。
  • 设置窗口尺寸:解析配置中的Resolution字符串,调用appWindow.Resize()设置窗口宽高;辅助方法CenterWindow确保窗口在屏幕居中显示。
  • 切换窗口/全屏模式:读取配置中的全屏标记(示例用IsFullscreen键),若为true则调用SetPresenter(AppWindowPresenterKind.FullScreen)进入全屏,否则保持窗口模式。
  • 禁用最大化/最小化按钮:通过TitleBar.IsMaximizeButtonEnabled和TitleBar.IsMinimizeButtonEnabled属性直接关闭对应按钮功能。

注意事项

  • 确保配置中Resolution的格式为宽度x高度(如1920x1080),若格式不合法会使用默认尺寸;
  • 全屏模式下系统会自动覆盖窗口尺寸设置,无需重复调用Resize;
  • 若你的全屏配置键名不是IsFullscreen,请修改代码中对应的键名;
  • GetAppWindowForWindow是MAUI WinUI中获取窗口核心控制实例的标准方式,依赖WinRT互操作API。

内容的提问来源于stack exchange,提问作者Giancarlo Franco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:04:50