CanvasDrawingSession.DrawSvg()是否可以在C ++ / winrt中工作?

时间:2018-11-19 18:48:37

标签: c++-winrt win2d

我通过为每个图像创建和存储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的方式上。只要有足够的信息,我就会立即发布自己的答案,这可能对某人有用。

1 个答案:

答案 0 :(得分:0)

答案是我的代码包含一个严重错误:正如在GitHub上向我指出的那样,LoadAsync()是一个静态方法。在上面的第一行中,我创建了一个CanvasSvgDocument,但是在第三行中,我忽略了LoadAsync的结果。 LoadASync也是一个构造函数,因此正确的代码是

auto fileStream = co_await nextFile.OpenReadAsync();
nextSvg = co_await CanvasSvgDocument::LoadAsync(resourceCreator.Device(),fileStream);

那行得通!唯一的麻烦是我真正想要的是使用另一个静态方法LoadFromXaml(),稍后将解决另一个问题。可能也是我的错误。