首页 > 解决方案 > 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 事件。我在后台需要画布。并且还会出现“值不在预期范围内”的错误。任何人都可以帮助我吗?

标签: c#uwpwin2d

解决方案


使用 Canvas 时,CanvasControl 不会触发 Draw 事件

Canvas 是一个使用绝对定位的控件。不显式设置orCanvasControl就不会渲染,自然不会触发事件。WidthHeightDraw

如果要触发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事件。

谢谢。


推荐阅读