问题描述
我要在Win2D的UWP应用中尝试做的事情: 用户按下按钮以添加图像并选择他们的文件。 该文件将作为Canvas控件的资源加载。 然后将图像渲染到当前的绘图会话中
单击按钮时:
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();
};
#endif
我已经在其中加载了一些图像,但是这些都是程序的一部分,并且是在使用这些图像创建画布之前创建的。不确定如何与用户选择的对象一起使用。
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,new Uri("ms-appx:///Assets/Pictures/logo.png"));
}
解决方法
从文件选择器将图像加载到Canvas控件中
对于您的情况,您可以使用CanvasDrawingSession
方法获得CreateDrawingSession
。然后使用此drawingsession将选取的图像绘制到当前的CanvasControl
。
例如。
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);
}
}
}