UWP (Windows 10 App) InkCanvas LoadAsync Error HRESULT E_FAIL 已从对 COM 组件的调用返回
UWP (Windows 10 App) InkCanvas LoadAsync Error HRESULT E_FAIL has been returned from a call to a COM component
我在作为 Windows 10 App 开发的 UWP 应用程序中使用 InkCanvas。我已成功将 JPG 格式的绘图保存到 LocalStorage。
我想将绘图加载到 InkCanvas 对象中,以便可以在 DataGrid 上选择和重新排列它。我遇到以下错误。
如有帮助,万分感谢
异常:
{System.Runtime.InteropServices.COMException (0x80004005): Error HRESULT E_FAIL has been returned from a call to a COM component.
at Windows.UI.Input.Inking.InkStrokeContainer.LoadAsync(IInputStream inputStream)
at TICAppUWP.CoverPage.canvasFileNotes()}
保存:
StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(fileNotesFolderPath);
string fileName = App._PreparedFor +"_"+ App._Date + "_PageID_" + App._CoverPageID;
var file = await storageFolder.CreateFileAsync(fileName + ".jpg", CreationCollisionOption.ReplaceExisting);
CanvasDevice device = CanvasDevice.GetSharedDevice();
CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, (int)myInkCanvas.ActualWidth, (int)myInkCanvas.ActualHeight, 96);
using (var ds = renderTarget.CreateDrawingSession())
{
ds.Clear(Windows.UI.Colors.White);
ds.DrawInk(myInkCanvas.InkPresenter.StrokeContainer.GetStrokes());
}
using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Jpeg, 1f);
}
加载:
StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(fileNotesFolderPath);
string fileName = App._PreparedFor + "_" + App._Date + "_PageID_" + App._CoverPageID;
var file = await storageFolder.GetFileAsync(fileName + ".jpg");
StorageFile inkFile = await storageFolder.GetFileAsync(fileName + ".jpg");
if (file != null)
{
Windows.Storage.Streams.IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
using (var inputStream = stream.GetInputStreamAt(0))
{
await myInkCanvas.InkPresenter.StrokeContainer.LoadAsync(stream);
}
stream.Dispose();
}
UWP (Windows 10 App) InkCanvas LoadAsync Error HRESULT E_FAIL has been returned from a call to a COM component
请参考InkStrokeContainer
document 将指定流中的所有InkStroke对象异步加载到InkStrokeContainer管理的InkStroke集合中。
但是您传递给 LoadAsync
方法的流是图像文件流而不是 InkStroke 集合流。所以它会抛出异常。
对于这种情况,您需要使用 SaveAsync
方法保存 InkStroke 流,而不是保存为图像文件。
我在作为 Windows 10 App 开发的 UWP 应用程序中使用 InkCanvas。我已成功将 JPG 格式的绘图保存到 LocalStorage。
我想将绘图加载到 InkCanvas 对象中,以便可以在 DataGrid 上选择和重新排列它。我遇到以下错误。
如有帮助,万分感谢
异常:
{System.Runtime.InteropServices.COMException (0x80004005): Error HRESULT E_FAIL has been returned from a call to a COM component. at Windows.UI.Input.Inking.InkStrokeContainer.LoadAsync(IInputStream inputStream) at TICAppUWP.CoverPage.canvasFileNotes()}
保存:
StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(fileNotesFolderPath);
string fileName = App._PreparedFor +"_"+ App._Date + "_PageID_" + App._CoverPageID;
var file = await storageFolder.CreateFileAsync(fileName + ".jpg", CreationCollisionOption.ReplaceExisting);
CanvasDevice device = CanvasDevice.GetSharedDevice();
CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, (int)myInkCanvas.ActualWidth, (int)myInkCanvas.ActualHeight, 96);
using (var ds = renderTarget.CreateDrawingSession())
{
ds.Clear(Windows.UI.Colors.White);
ds.DrawInk(myInkCanvas.InkPresenter.StrokeContainer.GetStrokes());
}
using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Jpeg, 1f);
}
加载:
StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(fileNotesFolderPath);
string fileName = App._PreparedFor + "_" + App._Date + "_PageID_" + App._CoverPageID;
var file = await storageFolder.GetFileAsync(fileName + ".jpg");
StorageFile inkFile = await storageFolder.GetFileAsync(fileName + ".jpg");
if (file != null)
{
Windows.Storage.Streams.IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
using (var inputStream = stream.GetInputStreamAt(0))
{
await myInkCanvas.InkPresenter.StrokeContainer.LoadAsync(stream);
}
stream.Dispose();
}
UWP (Windows 10 App) InkCanvas LoadAsync Error HRESULT E_FAIL has been returned from a call to a COM component
请参考InkStrokeContainer
document 将指定流中的所有InkStroke对象异步加载到InkStrokeContainer管理的InkStroke集合中。
但是您传递给 LoadAsync
方法的流是图像文件流而不是 InkStroke 集合流。所以它会抛出异常。
对于这种情况,您需要使用 SaveAsync
方法保存 InkStroke 流,而不是保存为图像文件。