在我的 WinUI3(C++/WinRT) 应用程序中,我有一个 Win2D CanvasControl,我想在其中绘制图像。它在画布初始化时使用CanvasBitmap::LoadAsync()加载。我很难使用 C++ 协程让它工作。
相关代码如下。
// MainWindow.xaml
<Window>
<Grid>
<canvas:CanvasControl x:Name="mainCanvas"Draw="mainCanvas_Draw" CreateResources="mainCanvas_CreateResources"/>
</Grid>
</Window>
// MainWindow.xaml.cpp
MainWindow::MainWindow()
{
InitializeComponent();
// Sprite is a custom class and pSprite is a unique_ptr in the MainWindow class
pSprite = std::make_unique<Sprite>(float2{ 300.0f, 300.0f }, 50.0f, 60.0f);
}
void MainWindow::mainCanvas_Draw(const CanvasControl& sender, const CanvasDrawEventArgs& args)
{
pSprite->Update();
pSprite->Draw(args, spriteBitmap);
}
void MainWindow::mainCanvas_CreateResources(CanvasControl const& sender, winrt::Microsoft::Graphics::Canvas::UI::CanvasCreateResourcesEventArgs const& args)
{
args.TrackAsyncAction(CreateResourcesAsync(sender));
}
IAsyncAction MainWindow::CreateResourcesAsync(CanvasControl const& sender)
{
// spriteBitmap is a member variable of MainWindow class
spriteBitmap = co_await CanvasBitmap::LoadAsync(sender, Uri(L"ms-appx:///Assets/sprite.png"));
}
当我使用上面的代码运行应用程序时,会引发异常并且消息是“应用程序调用了为不同线程编组的接口。”。
非常感谢有关如何在 WinUI (C++/WinRT) 中处理异步操作的指导!