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
相关产品推荐
相关产品推荐

