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

C++/WinRT WinUI3 ContentDialog异步调用问题求助

问题解决方案

问题1:始终返回ContentDialogResult::None的原因及解决

  • 直接调用GetResults()会在异步操作(对话框显示)未完成时立即返回,此时用户还未操作对话框,结果自然是ContentDialogResult::None。必须等待ShowAsync()执行完成后再获取结果,这就需要使用co_await关键字。

问题2:co_await编译报错的解决

  • C++/WinRT中,使用co_await的函数必须返回异步类型(比如IAsyncAction),不能是void。原函数返回void,编译器无法找到对应的协程promise_type,因此触发报错。

修改后的完整代码

IAsyncAction MainWindow::OnButtonClick(IInspectable const&, RoutedEventArgs const&)
{
    ContentDialog dialog;
    dialog.Title(box_value(L"title"));
    dialog.Content(box_value(L"content"));
    dialog.PrimaryButtonText(L"Red");
    dialog.SecondaryButtonText(L"Blue");
    dialog.CloseButtonText(L"Close");
    dialog.XamlRoot(myButton().XamlRoot());

    // 等待对话框关闭,获取用户操作结果
    ContentDialogResult cdr = co_await dialog.ShowAsync();

    if (cdr == ContentDialogResult::Primary)
    {
        SolidColorBrush myBrush{ Microsoft::UI::Colors::Red() };
        contentGrid().Background(myBrush);
    }
    else if (cdr == ContentDialogResult::Secondary)
    {
        SolidColorBrush myBrush{ Microsoft::UI::Colors::Blue() };
        contentGrid().Background(myBrush);
    }
}

额外注意事项

  • 确保项目启用C20或更高版本标准:在项目属性的「C/C -> 语言 -> C标准」中设置为ISO C++20标准 (/std:c++20),因为协程是C20特性。
  • 确认已引入必要头文件:#include <winrt/Microsoft.UI.Xaml.Controls.h>,保证ContentDialog及相关类型定义正确加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:48:29