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

