WinUI3 C++/WinRT中使用winrt::make<>创建XAML Page实例编译报错的求助
WinUI3 C++/WinRT中使用winrt::make<>创建XAML Page实例编译报错的求助
嘿,刚接触WinUI3 C++/WinRT确实容易踩这个坑,我来帮你捋捋问题出在哪以及怎么解决!
你的问题场景
你在WinUI3 C++/WinRT的蛇游戏项目里,想给ContentDialog设置一个自定义XAML Page(StartDialog)作为内容,用了winrt::make<winrt::snake_exp::StartDialog>(),结果编译报了一堆类似'implements_type': is not a member of any direct or indirect base class of 'winrt::snake_exp::StartDialog'的错误。
先看你这段出问题的核心代码:
// 你原来的错误写法 playGameDialog.Content(winrt::make<winrt::snake_exp::StartDialog>());
错误原因
winrt::make<>这个模板函数是用来手动创建你自己实现了WinRT接口的自定义runtime类的(也就是那些继承自winrt::implements的类)。但XAML页面类(比如你的StartDialog)是由Visual Studio的XAML编译器自动生成的partial类,它已经内置了WinRT激活所需的全部基础设施,根本不需要用winrt::make<>来实例化——直接用类的构造函数就行!
解决方法
把winrt::make<>的写法换成直接实例化Page类,修改后的完整代码如下:
winrt::fire_and_forget MainWindow::PlayGround_Loaded(winrt::Windows::Foundation::IInspectable const&, winrt::Microsoft::UI::Xaml::RoutedEventArgs const&) { Controls::ContentDialog playGameDialog; playGameDialog.Title(box_value(L"Start Game?")); // 重点:直接用构造函数实例化XAML Page,不用winrt::make<> winrt::snake_exp::StartDialog startDialogContent; playGameDialog.Content(startDialogContent); playGameDialog.PrimaryButtonText(L"Yes! :-)"); playGameDialog.CloseButtonText(L"No"); playGameDialog.DefaultButton(Controls::ContentDialogButton::Primary); // 必须设置XamlRoot,否则对话框无法显示 playGameDialog.XamlRoot(PlayGround().XamlRoot()); Controls::ContentDialogResult result = co_await playGameDialog.ShowAsync(); if (result == Controls::ContentDialogResult::Primary) { ResetGame(); StartGame(); // 给MainGrid设置焦点以接收键盘输入 MainGrid().Focus(winrt::Microsoft::UI::Xaml::FocusState::Programmatic); } // else,什么都不做 }
额外注意点
- 确保你的
StartDialog页面是正确创建的:它应该是项目里的一个XAML Page项,XAML文件和对应的.cpp/.hpartial类文件都存在,且没有独立的编译错误。 - 记住一个关键规则:所有XAML设计器生成的页面/控件类,都直接用构造函数实例化,不要用winrt::make<>。只有当你自己手动写了继承
winrt::implements的自定义WinRT runtime类时,才需要用winrt::make<>。
这样修改后,那些编译错误应该就会消失啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

