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

WinRT/C++ WinUI3中NavigationView导航报错及页面引用求助

WinRT/C++ WinUI3 NavigationView导航问题解决

一、解决C2338错误

这个错误的核心原因是xaml_typename<T>要求T必须是合法的WinRT类型,你的代码要么没传入正确的页面类型,要么页面未被正确注册为WinRT组件。

正确导航代码写法

确保传入已创建的WinUI页面类型,比如你有一个名为SecondPage的页面,导航代码应写成:

// 先在MainWindow.cpp顶部包含页面头文件
#include "SecondPage.h"

// 在SelectionChanged或ItemInvoked事件处理函数中执行导航
this->ContentFrame().Navigate(xaml_typename<SecondPage>());

注意:检查XAML中Frame控件的Name属性是否为ContentFrame(若你命名为ContentFram需对应修改,但通常默认命名为ContentFrame)。

二、正确添加并引用新页面

和C# WinUI3不同,C++ WinUI3的页面必须是WinRT组件类型,不能直接使用普通C++类,操作步骤如下:

  • 在VS解决方案资源管理器中,右键项目 → 添加 → 新建项 → 选择WinUI → WinUI 3 Page (C++),输入页面名称(如SecondPage)后创建。
  • VS会自动生成SecondPage.h、SecondPage.cpp和SecondPage.xaml文件,同时自动注册该WinRT类型,无需手动额外配置。
  • 在MainWindow.cpp顶部添加头文件引用:#include "SecondPage.h",即可在导航代码中使用该页面类型。

三、额外注意事项

  • 确保MainWindow.xaml中存在Frame控件并设置正确Name,示例XAML结构:
<NavigationView x:Name="NavView" SelectionChanged="NavView_SelectionChanged">
    <Frame x:Name="ContentFrame" />
</NavigationView>
  • 如需传递导航参数,可在Navigate方法的第二个参数传入包装后的值:
this->ContentFrame().Navigate(xaml_typename<SecondPage>(), winrt::box_value(L"测试参数"));

然后在目标页面的OnNavigatedTo方法中解析参数:

void SecondPage::OnNavigatedTo(winrt::Microsoft::UI::Xaml::Navigation::NavigationEventArgs const& e)
{
    if (e.Parameter())
    {
        auto param = winrt::unbox_value<hstring>(e.Parameter());
        // 此处处理参数逻辑
    }
}

内容的提问来源于stack exchange,提问作者Hamed Rezaei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:51:20