如何获取承载UIElement实例的窗口



我正在尝试获取Window实例,该实例在WinUI 3中托管UIElement实例。

在.NET的Window类中有一个helper方法(请参阅此线程(,但我找不到类似的C++/WinRT方法。

我按照一些人的建议尝试了VisualTreeHelper,但在这里没有帮助;父母均为CCD_ 4型。

是否可以获得依赖对象的宿主Window

如果它是一个UWP应用程序,则每个UI线程已经有一个可以使用静态Window.Current属性检索的Window。

如果是桌面应用程序中的C++/WinRT-WinUI3,则Window通过Window的HWND(WindowHandle(实现IWindowNative以启用互操作。您可以获得窗口的句柄并执行您想要的操作。类似:

// Get the current window's HWND by passing in the Window object
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this);

有关更多信息,请查看:Window Class Windows App SDK

这个问题一直困扰着我。我发现这个API从winrt-18362开始就可用了。不幸的是,这里需要的AppWindow位于命名空间Windows.UI.Xaml.Hosting下,而不是Microsoft.UI.Windowing下。后一个很容易从HWND中获得。顺便说一句,我也尝试过将Window实例存储在某个地方,但总是失败,因为它的构造函数出现了一些错误。然后,我通过将其存储为静态常量引用并通过其指针重新分配变量,最终实现了这一点。

我只是在这里找到了一种管理Window实例的替代方法。这将帮助我们从任何已知的自定义实现类型中获取窗口。但是,由于没有"内联",将出现没有初始化的链接错误或编译错误。