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