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 调用调整大小之间所花费的时间。但是,将其直接移动到特定于平台的代码会更加语义化。
与其他答案不同,我们无法从客户端页面获取请求的尺寸以用作我们的窗口尺寸。