Работает ли CanvasDrawingSession.DrawSvg () в C ++ / winrt? - PullRequest
0 голосов
/ 19 ноября 2018

Я загрузил серию изображений 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 ()? Я успешно нарисовал svgs, если они загружены как источники изображений; Полученное растровое изображение работает. Но возможно ли, что session.DrawSvg () просто еще не полностью реализован в Win2D? Я бы предпочел визуализировать svg напрямую, если это возможно.

[Update] p.s. Svgs - это svgs версии 1.1, конвертированные из pdf одним из сервисов онлайн-конвертации. Как я уже упоминал, они хорошо отображаются при открытии в Edge или других браузерах.

[Update2] Думая, что, возможно, в svgs есть что-то, что не нравится 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>

[Update] Похоже, что проблема заключается в том, как svg читается из файла хранилища. Я опубликую свой собственный ответ, как только мне будет достаточно, чтобы он мог кому-нибудь пригодиться.

1 Ответ

0 голосов
/ 21 ноября 2018

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

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

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

...