I have a follow-on question to this one: c-winrt-xaml-contentdialog. I'm trying to learn C++/WinRT and WinUI 3 by migrating the code from Petzold's "Programming Windows" 6th edition. I'm up to chapter 7, and am stuck on the "HowToAsync1" project. I created the standard WinUI 3 Desktop app and am trying to use this for the click handler:
void 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());
IAsyncOperation<ContentDialogResult> result = /*co_await*/ dialog.ShowAsync();
ContentDialogResult cdr = result.GetResults();
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);
}
}
The code compiles and runs, but there are 2 problems:
- cdr is returned as ContentDialogResult::None regardless of which button I press. I discovered that this is because the if statement executes before the dialog even appears, which leads to problem #2:
- If I uncomment the "co_await" that Kenny Kerr suggested, the compiler complains that class std::corouting_traits<…> has no member “promise_type”, and the code won't compile.
Suggestions?
Here's the working code, incorporating Raymond Chen's suggestion: