如何从Xml字符串加载CanvasSvgDocument?

时间:2018-11-21 20:42:44

标签: c++-winrt win2d

我正在尝试使用CanvasSvgDocument :: LoadFromXml(resourcecreator,hstring)创建CanvasSvgDocument。我正在存储各种svg的字符串,以便可以在CreateResources()中快速重新创建它们,而无需访问磁盘上的文件。尽管构建良好,但调用始终失败,并显示“参数不正确”和hresult_invalid_argument。这是代码:

CanvasSvgDocument nextSvg = CanvasSvgDocument::LoadFromXml(resourceCreator, xmlString);

资源创建者似乎是正确的;我可以看一下它的属性。 xmlstring是通过将文件数据加载到std :: string并使用to_hstring进行转换而创建的hstring。在调试器中检查时,它看起来正确。我以为问题可能是svgs标记为encoding =“ UTF-8”,这似乎与将文本转换为宽字符的冲突。但是,将编码引用更改为UTF-16或UTF-16LE或将其删除似乎没有什么不同。首先创建一个宽的测试字符串没有什么不同。将resourceCreator更改为resourceCreator.Device()没什么区别,使用CanvasDevice :: GetSharedDevice()也不会有任何区别。有没有可以在C ++ / winrt中正确使用的LoadFromXml示例?这段代码中必须有一些基本错误。使用VS 15.9.0 Preview 6,SDK17763。谢谢。 [更新]这个问题的答案可能是一个线索:CanvasSvgDocument :: LoadAsync()是否对svg数据进行任何编辑,但是LoadFromXml()不这样做?我看到如果使用LoadAsync()创建了这些svg文件,则会加载并显示这些文件,但除非我对string参数进行某些编辑,否则LoadFromXml()会崩溃。我要做的是从一个只包含一个空svg的字符串开始,然后从一个svg文件中逐步添加回元素。经过大量测试后,我发现单个引用使LoadFromXml崩溃-尽管相同的svg加载与通过LoadAsync编写的相同。在我对std :: wstring的论点中看起来像这样(在整个“之前”加上了\)。

<g id=\"surface1\"><use xlink:href=\"#surface4\"/></g>

从中删除

<use xlink:href=\"#surface4\"/>

并且svg加载时不会崩溃,但是绘制时仍不会显示。 #surface4指的是前一个g元素的ID。

我对svg的了解还不足以理解这一点,但是如果有人知道LoadAsync是否“清理”了一个svg,但LoadFromXml却没有,它将有助于找到答案。也许根本无法使用LoadFromXml使用文件数据来加载svg?

0 个答案:

没有答案