В проекте C ++ / winrt у меня есть большое количество небольших ресурсов SVG для загрузки из файла. Поскольку было бы медленно перезагружать их все с диска при каждом событии CreateResources из CanvasVirtualControl, я заранее загрузил их и сохранил данные для каждого в массиве. Когда происходит CreateResources, я собираюсь загрузить CanvasSvgDocument для каждого из них, используя метод CanvasSvgDocument LoadFromXml (System.string). Однако, если я создаю svgDocument с помощью resourcecreator, я получаю неверный аргумент сбой при вызове LoadFromXml (). Аргумент resourceCreator выглядит правильно (VS Preview 6 теперь позволяет мне видеть локальные переменные!), А аргумент строки данных xml выглядит как действительные данные svg, поэтому мое лучшее предположение о сбое заключается в том, что строка данных имеет неправильный формат. Данные файла - UTF-8. Если я преобразую это в std :: wstring, как это необходимо для аргумента LoadFromXml, можно ли его понимать как байтовые данные?
Например, я создаю std :: wstring таким образом, учитывая указатель на неподписанные данные char-файла и его длину в байтах:
m_data_string = std::wstring(data, data + dataLength);
Когда триггеры CreateResources запущены, на эту строку данных ссылаются следующим образом:
m_svg = CanvasSvgDocument(resourceCreator);
m_svg.LoadFromXml(resourceCreator, m_data_string);
Но LoadFromXml падает с ошибкой этого недопустимого параметра. Я вижу, что длина строки данных является правильной, но, конечно, это количество символов, а не фактический размер данных. Может ли быть конфликт между атрибутом UTF-8 в svg и тем фактом, что он теперь записывается как 16-битные символы? Если так, как можно загрузить документ XML из таких данных?
[Обновить] с предложением использовать winrt :: to_hstring. Я прочитал данные без знака в std :: string,
std::string cstring = std::string("");
cstring.assign(data, data + dataLength);
Затем я конвертирую это:
m_data_string = winrt::to_hstring(cstring);
И, наконец, попробуйте загрузить SVG, как и раньше:
m_svg.LoadFromXml(resourceCreator, m_data_string);
И он вылетает, как и раньше. Я заметил, что в отладчике преобразованная строка ни в одном случае не выглядела как бред, в обоих случаях она считывалась в отладчике как ожидаемые данные SVG. Но если эта строка имеет широкие символы, не будет ли это конфликтом с атрибутом в SVG, который идентифицирует его как UTF-8?
[Обновление] Я начинаю задумываться, не использовал ли кто-нибудь CanvasSvgDocument.Draw () для рисования SVG, загруженного из файла. Файлы теперь загружаются без сбоев без изменения их внутренней ссылки на кодировку. Но - они не будут рисовать. Эти файлы - 239 из них - UTF-8, svg 1.1, и они хорошо отображаются при открытии в Edge или любом браузере. Но если я загружаю данные файла в hstring, создаю CanvasSvgDocument, а затем использую CanvasSvgDocument.LoadFromXml, чтобы загрузить их, они не рисуются при вызове методом рисования CanvasSvgDocument. Другое рисование фигур и т. Д. Отлично работает во время сеанса рисования. Вот что может быть подсказкой: если я вызываю GetXML () для одного из этих svgs после его загрузки, возвращается только следующее:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>
То есть информация о чертеже отсутствует. Или это полная степень того, что GetXml () должен возвращать? Это не показалось бы полезным. Таким образом, возможно CanvasSvgDocument.LoadFromXml (ResourceCreator, String) на самом деле еще не работает?
Итак, я снова задаюсь вопросом: есть ли способ загрузить функциональный CanvasSvgDocument из данных файла?