WinRT/C++ 开发 WinUI3 应用时如何点击按钮打开新浮动窗口
WinRT/C++ WinUI3 打开新浮动窗口实现方案
前置配置修正
- 首先在预编译头文件
pch.h中添加以下包含语句,解决头文件导入失败问题:
#include <winrt/Microsoft.UI.Xaml.h> #include <winrt/Microsoft.UI.Windowing.h> #include <winrt/Microsoft.UI.Xaml.Controls.h>
- 确认项目已正确安装Windows App SDK NuGet包,版本≥1.0稳定版,避免运行时dll加载错误。
具体实现步骤
1. 新增自定义窗口类
在项目中添加新的WinUI窗口项(不要用Page类型),比如命名为SecondaryWindow,IDE会自动生成对应的xaml和代码文件,生成的类默认继承自Microsoft::UI::Xaml::Window,可直接使用。
2. 按钮点击事件中创建激活窗口
Window::Current()仅适用于UWP场景,WinUI3桌面应用没有全局当前窗口实例,这是你之前触发异常的核心原因。直接在主窗口的按钮点击回调中使用如下代码即可:
void MainWindow::OpenWindowBtn_Click(winrt::Windows::Foundation::IInspectable const&, winrt::Microsoft::UI::Xaml::RoutedEventArgs const&) { // 实例化自定义的次级窗口类 winrt::你的项目命名空间::SecondaryWindow newWindow{}; // 可选:设置新窗口的尺寸、位置 auto appWindow = newWindow.AppWindow(); appWindow.Resize({ 450, 600 }); // 激活显示窗口,默认浮动在主窗口上层 newWindow.Activate(); // 注意:如果需要窗口长期存在不被销毁,将newWindow定义为主窗口的成员变量存储,避免局部变量出作用域后析构导致窗口闪退 // m_secondaryWindow = newWindow; }
之前操作报错的原因说明
Frame.Navigate(xaml_typename<NewWindowClass>()):Frame.Navigate仅支持导航到Page类型,不能传入Window类型,属于用法错误。- 调用
Window::Current()抛出异常:该API不支持WinUI3桌面场景,仅UWP项目可使用。 - 直接实例化
Microsoft::UI::Xaml::Window基类报错:不能直接实例化Window基类,必须使用你自己新增的继承自Window的自定义窗口子类。
内容的提问来源于stack exchange,提问作者rileyd
相关产品推荐
相关产品推荐

