C# 在Win2d canvasControl中,如何在需要时多次调用createResources事件?

C# 在Win2d canvasControl中,如何在需要时多次调用createResources事件?,c#,uwp,win2d,C#,Uwp,Win2d,我有一个canvasControl,在我运行程序时CreateResources事件只触发一次。我有一个文件选择器从本地选择图像源。每当选择图像时,我需要调用CreateResources事件加载资源,然后使用canvasBitmap和DrawingSession绘制它。 我知道如何画画,但我不知道如何在拾取图像时加载资源。有人能给我建议,如何实现这一点吗???在Win2D中,CreateResource事件仅在加载CanvasControl时触发,也就是说,它只会触发一次 如果在此之后需要创建

我有一个canvasControl,在我运行程序时CreateResources事件只触发一次。我有一个文件选择器从本地选择图像源。每当选择图像时,我需要调用CreateResources事件加载资源,然后使用canvasBitmap和DrawingSession绘制它。
我知道如何画画,但我不知道如何在拾取图像时加载资源。有人能给我建议,如何实现这一点吗???

在Win2D中,
CreateResource
事件仅在加载
CanvasControl
时触发,也就是说,它只会触发一次

如果在此之后需要创建资源,则需要创建自定义
LoadResourcesForLevelAsync
方法:

async Task LoadResourcesForLevelAsync(CanvasControl resourceCreator,int级别)
{
levelBackground=wait CanvasBitmap.LoadAsync(resourceCreator,…);
levelThingie=wait CanvasBitmap.LoadAsync(resourceCreator,…);
//等等。
}
Win2D文档对此进行了解释,请参阅此文档:


更新

Draw
事件中加载图片的简单示例:

私有字符串imageFilePath=@“ms-appx:///Assets/StoreLogo.png";
私人拉票;
私人作废画布控制\u绘制(画布控制发送者、画布抽屉管理员参数)
{
如果(img!=null)
{
args.DrawingSession.DrawImage(img);
}
其他的
{
GetImage().Wait();
}
异步任务GetImage()
{
等待任务。运行(异步()=>
{
img=wait CanvasBitmap.LoadAsync(发送方,新Uri(imageFilePath));
}).配置等待(错误);
}
}

谢谢。

在Win2D中,
CreateResource
事件仅在加载
CanvasControl
时触发,即只触发一次

如果在此之后需要创建资源,则需要创建自定义
LoadResourcesForLevelAsync
方法:

async Task LoadResourcesForLevelAsync(CanvasControl resourceCreator,int级别)
{
levelBackground=wait CanvasBitmap.LoadAsync(resourceCreator,…);
levelThingie=wait CanvasBitmap.LoadAsync(resourceCreator,…);
//等等。
}
Win2D文档对此进行了解释,请参阅此文档:


更新

Draw
事件中加载图片的简单示例:

私有字符串imageFilePath=@“ms-appx:///Assets/StoreLogo.png";
私人拉票;
私人作废画布控制\u绘制(画布控制发送者、画布抽屉管理员参数)
{
如果(img!=null)
{
args.DrawingSession.DrawImage(img);
}
其他的
{
GetImage().Wait();
}
异步任务GetImage()
{
等待任务。运行(异步()=>
{
img=wait CanvasBitmap.LoadAsync(发送方,新Uri(imageFilePath));
}).配置等待(错误);
}
}

谢谢。

不必一直在
CreateResource
事件中加载资源,您可以随时加载资源(在
Draw
事件处理程序之外),然后调用
Invalidate
方法。看看这个:

CanvasBitmap btmp;
private async void LoadNecessaryResourcesAndDraw()
{
    btmp = await CanvasBitmap.LoadAsync(MyCanvasControl, "some_image.png");
    MyCanvasControl.Invalidate(); /// this will invoke the draw event
}

public void MyCanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
    if(btmp != null)
    {
        args.DrawingSession.DrawImage(btmp);
    }
}

现在,您可以随时调用
LoadNeccessarySourcesandDraw()
方法。它将异步加载图像,然后调用绘制图像的绘制事件。

无需始终在
CreateResource
事件中加载资源,您可以随时加载资源(在
draw
事件处理程序之外),然后只需调用
Invalidate
方法。看看这个:

CanvasBitmap btmp;
private async void LoadNecessaryResourcesAndDraw()
{
    btmp = await CanvasBitmap.LoadAsync(MyCanvasControl, "some_image.png");
    MyCanvasControl.Invalidate(); /// this will invoke the draw event
}

public void MyCanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
    if(btmp != null)
    {
        args.DrawingSession.DrawImage(btmp);
    }
}

现在,您可以随时调用
LoadNeccessarySourcesandDraw()
方法。它将异步加载图像,然后调用将绘制图像的绘制事件。

是的,我参考了win2d文档,我不明白他们想说什么..你能简单解释一下吗?我如何将其用于我的案例?您好,我更新了我的答案。另外,正如Muzib所说,
CreateResources
事件只会运行一次。这里您没有使用LoadResourcesForLevelAsync()和CreateResources事件??为什么?我省略了
CreateResources
事件的代码,因为该事件只能触发一次,因此,真正的解决方案是如何在
CreateResources
事件之外创建资源。官员给出的示例可能有点复杂,直接在UI线程中调用
Wait()
可能会导致死锁,因此我给出了一个简单的示例来说明我的意思。是的,我参考了win2d文档,我不明白他们想说什么。你能简单解释一下吗?我如何将其用于我的案例?您好,我更新了我的答案。另外,正如Muzib所说,
CreateResources
事件只会运行一次。这里您没有使用LoadResourcesForLevelAsync()和CreateResources事件??为什么?我省略了
CreateResources
事件的代码,因为该事件只能触发一次,因此,真正的解决方案是如何在
CreateResources
事件之外创建资源。官员给出的示例可能有点复杂,在UI线程中直接调用
Wait()
可能会导致死锁,因此我给出了一个简单的示例来说明我的意思。它可以工作,但我想使用createResources事件
CreateResource
事件设计为只使用一次,您不能手动调用它。它正在工作,但我想使用createResources事件?该
CreateResource
事件设计为仅使用一次,您不能手动调用它。