WINUI 3.0 - Reunion 0.5 窗口大小///
Posted
技术标签:
【中文标题】WINUI 3.0 - Reunion 0.5 窗口大小///【英文标题】:WINUI 3.0 - Reunion 0.5 window size/// 【发布时间】:2021-07-14 02:32:19 【问题描述】:我刚开始学习WinUI 3.0,在谷歌或Learn WinUI 3.0之类的书籍中找不到任何信息如何设置应用程序的默认窗口大小。我知道在 UWP 中可能是这样的
ApplicationView.PreferredLaunchViewSize = new Size(480, 800);
ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.PreferredLaunchViewSize;
但实际上它在 WinUI 中不起作用
【问题讨论】:
你测试过这个方法吗:github.com/microsoft/microsoft-ui-xaml/issues/2564 这里有一些关于如何最大化和最小化窗口的信息:***.com/a/71050224/4424024 【参考方案1】:看看这个存储库dotMorten/WinUIEx。
它包含一个设置窗口大小和位置的方法
myWindow.SetWindowPositionAndSize(100, 100, 1024, 768);
我还在WinUI3 Samples 中找到了一个示例 为了方便参考,我在这里添加相关代码
private void SetWindowSize(IntPtr hwnd, int width, int height)
var dpi = PInvoke.User32.GetDpiForWindow(hwnd);
float scalingFactor = (float)dpi / 96;
width = (int)(width * scalingFactor);
height = (int)(height * scalingFactor);
PInvoke.User32.SetWindowPos(hwnd, PInvoke.User32.SpecialWindowHandles.HWND_TOP,
0, 0, width, height,
PInvoke.User32.SetWindowPosFlags.SWP_NOMOVE);
【讨论】:
获取 hWnd:var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(m_window);【参考方案2】:无需您自己进行这些互操作调用,也无需为此使用第三方包。
试试这个三连击:
// Use 'this' rather than 'window' as variable if this is about the current window.
IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(window);
var windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(hWnd);
var appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);
然后你终于可以设置大小了:
appWindow.Resize(new Windows.Graphics.SizeInt32 Width = 480, Height = 800 );
请注意,AppWindow
对象还有其他几个功能,例如
MoveAndResize
、Show
、Hide
,以及修改标题栏的功能。
【讨论】:
【参考方案3】:这行得通。您将需要添加 nuget 包 PInvoke.User32。
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
m_window = new MainWindow();
m_window.Activate();
//Get the Window's HWND
var windowNative = m_window.As<IWindowNative>();
m_windowHandle = windowNative.WindowHandle;
m_window.Activate();
SetWindowBounds(0,0,100,100);
private Window m_window;
private IntPtr m_windowHandle;
public IntPtr WindowHandle get return m_windowHandle;
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("EECDBF0E-BAE9-4CB6-A68E-9598E1CB57BB")]
internal interface IWindowNative
IntPtr WindowHandle get;
public void SetWindowBounds(int x, int y, int width, int height)
var dpi = PInvoke.User32.GetDpiForWindow(m_windowHandle);
float scalingFactor = (float)dpi / 96;
width = (int)(width * scalingFactor);
height = (int)(height * scalingFactor);
PInvoke.User32.SetWindowPos(m_windowHandle, PInvoke.User32.SpecialWindowHandles.HWND_TOP,
x, y, width, height,
PInvoke.User32.SetWindowPosFlags.SWP_NOMOVE);
【讨论】:
【参考方案4】:我还不能评论答案,但要添加到 Jonas 的答案中,您可以将他的答案放在主窗口代码隐藏的类构造函数(this.InitializeComponent() 所在的位置)或 OnLaunched 方法中应用程序.cs。我敢肯定这对很多人来说似乎很明显,但对于那些来自其他语言/平台的人来说可能不是。示例:
public MainWindow()
this.InitializeComponent();
IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this); // m_window in App.cs
WindowId windowId = Win32Interop.GetWindowIdFromWindow(hWnd);
AppWindow appWindow = AppWindow.GetFromWindowId(windowId);
var size = new Windows.Graphics.SizeInt32();
size.Width = 480;
size.Height = 800;
appWindow.Resize(size);
// or like Jonas said:
// appWindow.Resize(new Windows.Graphics.SizeInt32 Width = 480, Height = 800 );
【讨论】:
以上是关于WINUI 3.0 - Reunion 0.5 窗口大小///的主要内容,如果未能解决你的问题,请参考以下文章
WinUI 3 - Project Reunion 0.8(和更高版本的 Windows App SDK)部署选项,如“XCOPY”(?)
WinUI 3.0 - 为啥 UWP 项目要求 MS Edge for Business 用于 WebView2
从 WinUI 3.0 Preview 3 Desktop App 中 WebView2 中的帖子获取响应
sh [下载并设置HDF 3.0泊坞窗容器]使用此脚本下载并设置HDF泊坞窗容器#hdf #docker #setup#hdf30