c# - win2D CanvasControl DrawImage() 通过错误“值不在预期范围内”?
问题描述
我试过什么?XAML 代码:
<Canvas x:Name="grid">
<canvas:CanvasControl Draw="CanvasControl_Draw" CreateResources="CanvasControl_CreateResourcesAsync" ></canvas:CanvasControl>
</Canvas>
C#代码:
CanvasBitmap canvasBitmap;
private async void CanvasControl_CreateResourcesAsync(CanvasControl sender, Microsoft.Graphics.Canvas.UI.CanvasCreateResourcesEventArgs args)
{
canvasBitmap = await CanvasBitmap.LoadAsync(sender, @"Assets\Square150x150Logo.scale-200.png");
sender.Invalidate();
}
private void CanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
Vector2 Vector = new Vector2();
Vector.X = 10;
Vector.Y = 10;
args.DrawingSession.DrawImage(canvasBitmap,Vector);
}
使用 Canvas 时,CanvasControl 不会触发 Draw 事件,如果我使用 Grid 而不是 Canvas,它会触发 CanvasControl 的 Draw 事件。我在后台需要画布。并且还会出现“值不在预期范围内”的错误。任何人都可以帮助我吗?
解决方案
使用 Canvas 时,CanvasControl 不会触发 Draw 事件
Canvas 是一个使用绝对定位的控件。不显式设置orCanvasControl
就不会渲染,自然不会触发事件。Width
Height
Draw
如果要触发Draw
事件,请设置 的 Width 和 Height 属性CanvasControl
,如:
<Canvas x:Name="grid">
<canvas:CanvasControl Draw="CanvasControl_Draw"
CreateResources="CanvasControl_CreateResources"
Width="500" Height="500"
/>
</Canvas>
还会出现“值不在预期范围内”的错误。
简单来说,这个错误的原因是该Draw
方法准备渲染尚未加载的图像。
如果要在CreateResources
事件中处理异步方法,比如图片加载,可以考虑这样做:
CanvasBitmap canvasBitmap;
private void CanvasControl_CreateResources(CanvasControl sender, Microsoft.Graphics.Canvas.UI.CanvasCreateResourcesEventArgs args)
{
args.TrackAsyncAction(CreateResourceAsync(sender).AsAsyncAction());
sender.Invalidate();
}
private async Task CreateResourceAsync(CanvasControl sender)
{
canvasBitmap = await CanvasBitmap.LoadAsync(sender, @"Assets\Square150x150Logo.scale-200.png");
}
这样可以确保Draw
在事件结束之前不会触发CreateResources
事件。
谢谢。
推荐阅读
- windows - 安装后无法在cmd上运行composer
- android - 如何在android中保持地图方向固定在北方
- python-3.x - 计算列表中坐标之间的距离
- spring-boot - 部署 Spring Boot 项目时 PCF 内部如何工作
- html - 如何将2个div放在同一个位置?
- safari - 以前有人在 Safari 上发现过这个错误吗?
- debugging - GitAhead 日志放在哪里?
- sql-server - 用于列的不同关键字,更改该列值的顺序,影响数据透视表
- latex - 乳胶,倾斜的盒子
- prolog - 解决此 Prolog Caliban 问题时的实例化问题