如何在C ++ / Winrt中将svg加载到CanvasVirtualControl?

我一直在使用C ++ / winrt构建的UWP应用中成功加载绘图svg图像,但是在最新版本中,发现加载svg的调用引发异常。 崩溃发生在难以追踪的IAsync方法中,但我已将问题缩小到了加载SVG的一行。

这通常是循环读取大量文件,但是非常简单地减少问题仍然显示该问题:

winrt::microsoft::Graphics::Canvas::UI::Xaml::CanvasVirtualControl resourceCreator
winrt::Windows::Storage::StorageFile nextFile = nullptr;
winrt::microsoft::Graphics::Canvas::Svg::CanvasSvgDocument nextSvg = nullptr;
winrt::Windows::Storage::Streams::IRandomaccessStream  fileStream = nullptr;

//This is called from within the lambda handling CreateResources for the CanvasVirtualControl
//The VirtualControl is provided as the resourceCreator argument

IAsyncaction loadSVGs(winrt::microsoft::Graphics::Canvas::UI::Xaml::CanvasVirtualControl resourceCreator)
{
nextFile = m_symbol_resource_files.Getat(i);
fileStream = co_await nextFile.OpenReadAsync();
nextSvg = co_await CanvasSvgDocument::LoadAsync(resourceCreator,fileStream);
}

对LoadAsync的调用失败,并显示

exception: winrt:hresult_invalid_argument at memory location 0x0C93F1CB
void resume()const{
->_coro_resume(_Ptr);
}

如果我继续通过该异常,则会发现该资源实际上已经加载并且可以使用。但是,如果在Visual Studio外部运行,则该应用程序通常会在此行退出。可能是CanvasVirtualControl不可接受吗?

还是有更好的方法从文件加载svg?我无法计算出CanvasDocument的LoadFromXML,因为它接受了C./winrt中不可用的System.String参数,并且winrt std :: wstring不能替代[更正:事实上,hstring可以作为参数,并且可以从std :: wstring]中创建。

[更新]我还没有创建一个简单的演示项目来显示此行为,但是我认为原因已经明确,我想扩展我的问题。我已经尝试了CanvasSvgDocument的LoadFromXml和LoadAsync方法,而第二种方法过去都很好,但是现在两者都以相同的方式失败,在我看来,ResourceCreator参数可能会带来麻烦。我正在CreateResources处理程序中创建这些资源,并将发送方CanvasVirtualControl作为resourceCreator传递。但是,两个CanvasSvgDocument调用列出的参数是ICanvasResourceCreator。我以为这很方便,可以直接为该参数传递CanvasVirtualControl(所以以前是这样)。但是,也许这是不正确的,也许一直是现在被发现是不正确的?如果是这样,如何将CreateResources处理程序中的发件人正确传递给CanvasSvgDocument方法?

zk2511380123zk 回答:如何在C ++ / Winrt中将svg加载到CanvasVirtualControl?

我创建了一个空白应用程序以使用CanvasVirtualControl加载SVG,它运行良好。您能否提供一个可以复制的简单样本?然后我检查了LoadFromXML方法,它需要的参数是hstring类型而不是System.String。

此外,关于从文件加载svg,您是否需要使用win2d来加载svg?如果没有,您可以尝试使用SvgImageSource的Image control加载svg,如下所示:

.xaml:

awk -v s1="\"" -v value="$var" '{gsub(/\047\/mnt\/\047/,s1 value s1)} 1' Input_file > temp && mv temp Input_file

.cpp:

<Image x:Name="MyImage" Width="300" Height="200"></Image>
本文链接:https://www.f2er.com/3120844.html

大家都在问