https://www.likecs.com/ask-10337653.html#sc=200

【解决方案1】:
为毛伊岛 GA 更新(我也会添加到该讨论中):


#if WINDOWS
using Microsoft.UI;
using Microsoft.UI.Windowing;
using Windows.Graphics;
#endif

namespace YourAppNameHere;

public partial class App : Application
{
    const int WindowWidth = 400;
    const int WindowHeight = 300;
    public App()
    {
        InitializeComponent();

        Microsoft.Maui.Handlers.WindowHandler.Mapper.AppendToMapping(nameof(IWindow), (handler, view) =>
        {
#if WINDOWS
            var mauiWindow = handler.VirtualView;
            var nativeWindow = handler.PlatformView;
            nativeWindow.Activate();
            IntPtr windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(nativeWindow);
            WindowId windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(windowHandle);
            AppWindow appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);
            appWindow.Resize(new SizeInt32(WindowWidth, WindowHeight));
#endif
        });

        MainPage = new MainPage();
    }

或者如果想基于 MainPage 的请求尺寸,before 附加处理程序可以这样做:

  MainPage = new MainPage();
        var width = (int)MainPage.WidthRequest;
        var height = (int)MainPage.HeightRequest;

然后使用这些尺寸(可能添加一些填充以获得整个窗口大小,因为 MainPage 是客户区)。

注意:我正在测试 Windows,因此在源文本编辑器窗格左上角的下拉菜单中,我选择了 (net6.0-windows10.0.19041.0)。这就是为什么我没有注意到我需要在usings 周围使用#if,以避免Android 等错误。

【讨论】:

编译失败:错误 CS0246:找不到类型或命名空间名称“WindowId”(是否缺少 using 指令或程序集引用?)错误 CS0246:类型或命名空间名称“AppWindow” ‘ 找不到(您是否缺少 using 指令或程序集引用?)错误 CS0246:找不到类型或命名空间名称“SizeInt32”(您是否缺少 using 指令或程序集引用?)
Visual Studio 建议所需的用途。单击每个带红色下划线的项目。通过出现的小图标从下拉列表中选择。 docs.microsoft.com/en-us/visualstudio/ide/…
命名空间不存在
请更新您的变量以使用 var 声明,以便编译此答案
我已经添加了所需的usings。请注意,它们必须被#if 包围以避免智能感知错误。我看到使用var 可以避免这种情况。但我决定改为显示使用的命名空间。 (它在没有 usings 周围的 #if 的情况下在 Windows 上运行,所以我没有注意到 INTELLISENSE 在抱怨。)
【解决方案2】:
如果您只想为桌面平台执行此操作,那么您可以通过覆盖 Platforms/Windows/App.xaml.cs 中的 OnLaunched 函数来针对每个平台执行类似于 @ToolmakerSteve 的操作。


using Microsoft.UI;
using Microsoft.UI.Windowing;
using Windows.Graphics;
using WinRT.Interop;
//...
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
    base.OnLaunched(args);

    var currentWindow = Application.Windows[0].Handler.PlatformView;
    IntPtr _windowHandle = WindowNative.GetWindowHandle(currentWindow);
    var windowId = Win32Interop.GetWindowIdFromWindow(_windowHandle);

    AppWindow appWindow = AppWindow.GetFromWindowId(windowId);
    appWindow.Resize(new SizeInt32(350, 600));
}

这些调整大小的方法仍然不理想,因为它会在更改窗口大小时闪烁。这仅仅是因为 OnLaunch 被触发和窗口被本机 win32 API 调用调整大小之间所花费的时间。但是,将其直接移动到特定于平台的代码会更加语义化。

与其他答案不同,我们无法从客户端页面获取请求的尺寸以用作我们的窗口尺寸。

文档更新时间: 2023-04-03 10:38   作者:admin