Как загрузить CanvasSvgDocument из строки XML? - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь использовать CanvasSvgDocument :: LoadFromXml (resourcecreator, hstring) для создания CanvasSvgDocument.Я храню строки различных svgs, так что я могу быстро воссоздать их в CreateResources (), не обращаясь к файлам на диске.Несмотря на то, что он работает нормально, вызов всегда завершается с ошибкой «параметр неверен» и hresult_invalid_argument.Вот код:

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

Создатель ресурса кажется правильным;Я могу посмотреть на его свойства.Xmlstring - это hstring, созданная путем загрузки файловых данных в std :: string и использования to_hstring для их преобразования.Это выглядит правильно, когда рассматривается в отладчике.Я думал, что проблема может заключаться в том, что svgs помечены с помощью encoding = "UTF-8", и это может противоречить тексту, преобразованному в широкие символы.Но изменение ссылки на кодировку на UTF-16 или UTF-16LE или удаление ее, похоже, не имеет значения.Создание тестовой строки, которая прежде всего широка, не имеет значения.Изменение resourceCreator на resourceCreator.Device () не имеет значения, равно как и использование CanvasDevice :: GetSharedDevice ().Есть ли пример LoadFromXml, как он будет правильно использоваться в C ++ / winrt?В этой одной строке кода должна быть какая-то базовая ошибка.Использование VS 15.9.0 Preview 6, SDK 17763. Спасибо.[Обновление] Подсказка может лежать в ответе на этот вопрос: CanvasSvgDocument :: LoadAsync () выполняет какое-либо редактирование данных SVG, а LoadFromXml () - нет?Я вижу, что эти файлы SVG загружаются и отображаются, если они созданы с помощью LoadAsync (), но LoadFromXml () дает сбой, если я не внесу определенные изменения в строковый аргумент.Я начал со строки, состоящей только из пустого svg, и затем постепенно добавлял обратно элементы из одного из файлов svg.После многочисленных тестов я нашел одну ссылку, которая вылетает LoadFromXml - хотя тот же svg загружается, как написано, если через LoadAsync.В моем аргументе это выглядит так: std :: wstring (добавлено \ before "through").

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

удалить из этого

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

и svg загружается без сбоев, но все равно не будет отображаться при рисовании. # surface4 ссылается на id предыдущего элемента g.

Я не знаю достаточно о svg, чтобы понять это, но если кто-то знает, является ли LoadAsync "очищает "svg, но LoadFromXml нет, это поможет найти ответ. Возможно, просто невозможно использовать LoadFromXml для загрузки svg с использованием данных файла?

...