Работает ли CanvasDrawingSession.DrawSvg () в C ++ / winrt?

Я загрузил серию изображений svg, создав и сохранив для каждого из них CanvasSvgDocument и используя его метод LoadAsync () для загрузки 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);

Пытаясь обнаружить проблему, я попытался использовать GetXml () в документе svg в надежде, что это покажет мне его содержимое. В результате получается сокращенный svg без информации о чертеже. Я предоставляю это здесь на случай, если это намек:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>

Возможно, это все, что должен вернуть GetXml ()? Я успешно нарисовал SVG, если они загружены как источники изображений; получившееся растровое изображение работает. Но возможно ли, что session.DrawSvg () еще не полностью реализован в Win2D? Я бы предпочел визуализировать svg напрямую таким образом, если это возможно.

[Обновить] p.s. SVG - это SVG версии 1.1, преобразованная из PDF-файлов одной из онлайн-служб конвертации. Как я уже упоминал, они нормально отображаются, если открыты в Edge или других браузерах.

[Обновление2] Думая, что в 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 из файла хранилища. Я отправлю свой ответ, как только у меня будет достаточно, чтобы он мог быть кому-то полезен.


person user3743210    schedule 19.11.2018    source источник


Ответы (1)


Ответ заключается в том, что мой код содержит вопиющую ошибку: как мне было указано на GitHub, LoadAsync () - статический метод. В моей первой строке выше я создаю CanvasSvgDocument, но в третьей строке я игнорирую результаты LoadAsync. LoadASync также является конструктором, поэтому правильный код

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

Это работает! Единственная проблема в том, что я действительно хочу использовать LoadFromXaml (), еще один статический метод, и есть другая проблема, которая будет решена позже. Наверное, тоже моя ошибка.

person user3743210    schedule 21.11.2018