C# 从文件选择器将图像加载到画布控件

C# 从文件选择器将图像加载到画布控件,c#,windows,uwp,win2d,C#,Windows,Uwp,Win2d,我在使用Win2D的UWP应用程序中尝试执行的操作: 用户按下按钮添加图像并选择他们的文件。 该文件将作为画布控件的资源加载。 然后将图像渲染到当前绘图任务 单击按钮时: private async void btnAddPicture_Click(object sender, RoutedEventArgs e) { var picker = new Windows.Storage.Pickers.FileOpenPicker(); picker.Fil

我在使用Win2D的UWP应用程序中尝试执行的操作: 用户按下按钮添加图像并选择他们的文件。 该文件将作为画布控件的资源加载。 然后将图像渲染到当前绘图任务

单击按钮时:

private async void btnAddPicture_Click(object sender, RoutedEventArgs e)
    {
        var picker = new Windows.Storage.Pickers.FileOpenPicker();
        picker.FileTypeFilter.Add(".png");
        picker.FileTypeFilter.Add(".jpg");
        picker.FileTypeFilter.Add(".jpeg");
        overlayPictureFile = await picker.PickSingleFileAsync();
        if (overlayPictureFile == null)
        {
            txbNotification.Text = "File Picking cancelled";
            return;
        }
        else
        {
            txbNotification.Text = "Picture Loaded";
        }
        using (IRandomAccessStream stream = await overlayPictureFile.OpenAsync(FileAccessMode.Read))
        {
            var device = new CanvasDevice();
            createdBitmap = await CanvasBitmap.LoadAsync(device, stream);
        }
    }
在绘图功能中:

void CanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
    {
        if (createdBitmap != null)
        {
            args.DrawingSession.DrawImage(createdBitmap, Drawing.FindDefaultRect());
        }
        drawingCanvas.Invalidate();
    }
一切都将编译,但当我按下按钮添加图像时,它在这里中断

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
        UnhandledException += (sender, e) =>
        {
            if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
        };
#恩迪夫

我已经在这里加载了一些图像,但是这些都是程序的一部分,并且是在使用这些图像创建画布之前创建的。不知道如何使用用户选择的

private void drawingCanvas_CreateResources(CanvasControl sender, Microsoft.Graphics.Canvas.UI.CanvasCreateResourcesEventArgs args)
    {
        args.TrackAsyncAction(CreateResourcesAsync(sender).AsAsyncAction());
    }
    private async Task CreateResourcesAsync(CanvasControl sender)
    {
        logo = await CanvasBitmap.LoadAsync(sender, new Uri("ms-appx:///Assets/Pictures/Logo_BlackBorders.png"));
    }
更新: 我现在正在画东西。这是我试图添加图像的画布

void CanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
    {
        //Drawing a bunch of stuff
    }
    private void drawingCanvas_CreateResources(CanvasControl sender, Microsoft.Graphics.Canvas.UI.CanvasCreateResourcesEventArgs args)
    {
        args.TrackAsyncAction(CreateResourcesAsync(sender).AsAsyncAction());
    }
    private async Task CreateResourcesAsync(CanvasControl sender)
    {
        logo = await CanvasBitmap.LoadAsync(sender, new Uri("ms-appx:///Assets/Pictures/Logo.png"));
    }
从文件选择器将图像加载到画布控件

对于您的场景,您可以使用方法。然后使用此drawingsession将拾取的图像绘制到当前

比如说

private async void btnAddPicture_Click(object sender, RoutedEventArgs e)
{
    var picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.FileTypeFilter.Add(".png");
    picker.FileTypeFilter.Add(".jpg");
    picker.FileTypeFilter.Add(".jpeg");
    var overlayPictureFile = await picker.PickSingleFileAsync();
    if (overlayPictureFile == null)
    {

        return;
    }
    else
    {

    }
    using (IRandomAccessStream stream = await overlayPictureFile.OpenAsync(FileAccessMode.Read))
    {
        //get canvascontrol's Device property.
        CanvasDevice device = drawingCanvas.Device;
        createdBitmap = await CanvasBitmap.LoadAsync(device, stream);
        //use device property to make renderer
        var renderer = new CanvasRenderTarget(device,
                              createdBitmap.SizeInPixels.Width,
                              createdBitmap.SizeInPixels.Height, createdBitmap.Dpi);
        //make ds with above renderer.
        using (var ds = renderer.CreateDrawingSession())
        {
            ds.DrawImage(createdBitmap, 0, 0);
        }

    }
}