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

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,什么都不做
}

额外注意点

  1. 确保你的StartDialog页面是正确创建的:它应该是项目里的一个XAML Page项,XAML文件和对应的.cpp/.h partial类文件都存在,且没有独立的编译错误。
  2. 记住一个关键规则:所有XAML设计器生成的页面/控件类,都直接用构造函数实例化,不要用winrt::make<>。只有当你自己手动写了继承winrt::implements的自定义WinRT runtime类时,才需要用winrt::make<>。

这样修改后,那些编译错误应该就会消失啦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 13:09:36