Windows平台下如何指定MAUI应用程序的窗口大小?

问题描述 投票:0回答:2

我正在开发一个 .NET MAUI 应用程序,我想将其部署在 Android 之外的 Windows 上。

我的目标是仅指定最小窗口宽度和最小窗口高度

影响 Windows 作为一个平台。

我尝试在

App.xamls.cs
中设置上述属性:

public App()   
{
        InitializeComponent();

        Microsoft.Maui.Handlers.WindowHandler.WindowMapper[nameof(IWindow)] = (handler, view) =>
        {
#if WINDOWS
                    var nativeWindow = handler.NativeView;
                    nativeWindow.Activate();
                    IntPtr windowHandle = PInvoke.User32.GetActiveWindow();

                    PInvoke.User32.SetWindowPos(windowHandle, 
                    PInvoke.User32.SpecialWindowHandles.HWND_TOP,
                                        0, 0, width, height,  // width and height are ints
                                        PInvoke.User32.SetWindowPosFlags.SWP_NOMOVE);

#endif
        };
}

不幸的是,它不起作用,因为我收到以下错误:

Error  CS0117  'WindowHandler' does not contain a definition for 'WindowMapper

非常感谢任何帮助!

c# .net maui
2个回答
3
投票

如果您只想指定最小窗口宽度和最小窗口高度,可以将项目的目标框架设为.net 7.0。然后重写App的CreateWindow方法:

    protected override Window CreateWindow(IActivationState activationState)
      {
            var window = base.CreateWindow(activationState);
            window.MinimumHeight = 600; // set minimal window height
            window.MinimumWidth = 800; // set minimal window width
            return window;
      }

您还可以使用处理程序来调整窗口大小。在page.cs中:

protected override void OnHandlerChanged()
      {
            base.OnHandlerChanged();
#if WINDOWS
            Microsoft.UI.Xaml.Window? window = (Microsoft.UI.Xaml.Window?)(App.Current?.Windows.First<Window>().Handler.PlatformView);
            if(window == null){
                return;
            }
            IntPtr windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(window);
            Microsoft.UI.WindowId windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(windowHandle);
            Microsoft.UI.Windowing.AppWindow appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);
            appWindow.Resize(new Windows.Graphics.SizeInt32(800,600));
#endif
      }

1
投票

您可以利用 .NET MAUI 对部分类的支持来避免使用

#if WINDOWS
预处理器指令。

这是一个仅在 Window 中实现的部分方法的想法
注意:

App.cs
Windows 文件应具有与平台无关的相同命名空间
App.cs

App\App.xaml.cs

namespace App;

public partial class App : Application
{
    public App()
    {
        InitializeComponent();
    }

    protected override Window CreateWindow(IActivationState activationState)
    {
        var window = new Window(new AppShell());
        UpdateWindow(window);

        return window;
    }

    partial void UpdateWindow(Window window);
}

App\Platforms\Windows\App.cs

namespace App
{
    public partial class App : Application
    {
        partial void UpdateWindow(Window window)
        {
            window.MinimumWidth = 800;
            window.MinimumHeight = 600;

            window.Width = 1024;
            window.Height = 800;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.