我通过为每个图像创建和存储CanvasSvgDocument并使用其LoadAsync()方法加载svg来加载了一系列svg图像:
nextSvg = CanvasSvgDocument(resourceCreator.Device());
auto fileStream = co_await nextFile.OpenReadAsync();
co_await nextSvg.LoadAsync(resourceCreator.Device(),fileStream);
这似乎加载了svg,但是当我在绘图会话中使用存储的svg时,CanvasControl中什么也没有出现。其他项目可以很好地绘制:形状,线条等-而不是svgs:
session.DrawSvg(m_svg, boxSize, top, left);
为了发现问题,我尝试在svg文档上使用GetXml(),希望能向我展示其内容。结果是没有绘图信息的svg缩写。如果有提示,我在这里提供:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>
也许这就是GetXml()应该返回的全部? 如果将它们作为图像源加载,我已经成功绘制了svg。生成的位图图像有效。但是是否有可能在Win2D中尚未完全实现session.DrawSvg()?如果可以的话,我宁愿直接用这种方式渲染svg。
[更新] svg是由在线转换服务之一从pdf转换的1.1版svg。正如我提到的,如果在Edge或其他浏览器中打开它们,它们将呈现良好的效果。
[Update2]考虑到svg中可能存在Win2D不喜欢的东西,我尝试使用在线示例作为模型来创建一个简单的示例-它只有一个矩形和一个圆形,如下所示。但它也不会绘制:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 140"
preserveAspectRatio="xMidYMid meet">
<title>Scalable Vector Graphics (SVG) Demo</title>
<circle cx="100" cy="100" r="50" stroke="#000" stroke-width="1" fill="#ccc" />
<rect x="200" y="50" width="250" height="100" rx="5" ry="5"
stroke="#000" stroke-width="1" fill="#ccc" />
</svg>
[更新]看来问题出在从存储文件读取svg的方式上。只要有足够的信息,我就会立即发布自己的答案,这可能对某人有用。
答案 0 :(得分:0)
答案是我的代码包含一个严重错误:正如在GitHub上向我指出的那样,LoadAsync()是一个静态方法。在上面的第一行中,我创建了一个CanvasSvgDocument,但是在第三行中,我忽略了LoadAsync的结果。 LoadASync也是一个构造函数,因此正确的代码是
auto fileStream = co_await nextFile.OpenReadAsync();
nextSvg = co_await CanvasSvgDocument::LoadAsync(resourceCreator.Device(),fileStream);
那行得通!唯一的麻烦是我真正想要的是使用另一个静态方法LoadFromXaml(),稍后将解决另一个问题。可能也是我的错误。