win2D CanvasControl DrawImage () пропускает ошибку «Значение не попадает в ожидаемый диапазон»? - PullRequest
0 голосов
/ 23 апреля 2020

Что я пробовал? Код 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, он запускает событие Draw объекта CanvasControl. Мне нужен холст в фоновом режиме. И возникает ошибка «Значение не попадает в ожидаемый диапазон». Может ли кто-нибудь мне помочь ??

1 Ответ

1 голос
/ 23 апреля 2020

При использовании Canvas CanvasControl не будет запускать событие Draw

Canvas - это элемент управления, использующий абсолютное позиционирование. CanvasControl не будет отображаться без явной установки Width или Height и, естественно, не будет вызывать событие Draw.

Если вы хотите запустить событие Draw, установите ширину и свойства 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.

Спасибо.

...