You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:39:03