Как загрузить SVG в CanvasVirtualControl в C ++ / WinRT? - PullRequest
0 голосов
/ 12 ноября 2019

Я успешно загружал рисование изображений SVG в приложении UWP, созданном на C ++ / winrt, но в последнем выпуске обнаружил, что вызов для загрузки SVG вызывает исключение. Сбой происходит в методе IAsync, который трудно отследить, но я сузил проблему до одной строки, которая загружает SVG.

Обычно это цикл для чтения большого количества файлов, но очень простое сокращениепроблемы все еще отображает проблему:

winrt::Microsoft::Graphics::Canvas::UI::Xaml::CanvasVirtualControl resourceCreator
winrt::Windows::Storage::StorageFile nextFile = nullptr;
winrt::Microsoft::Graphics::Canvas::Svg::CanvasSvgDocument nextSvg = nullptr;
winrt::Windows::Storage::Streams::IRandomAccessStream  fileStream = nullptr;

//This is called from within the lambda handling CreateResources for the CanvasVirtualControl
//The VirtualControl is provided as the resourceCreator argument

IAsyncAction loadSVGs(winrt::Microsoft::Graphics::Canvas::UI::Xaml::CanvasVirtualControl resourceCreator)
{
nextFile = m_symbol_resource_files.GetAt(i);
fileStream = co_await nextFile.OpenReadAsync();
nextSvg = co_await CanvasSvgDocument::LoadAsync(resourceCreator,fileStream);
}

Сбой вызова LoadAsync с

exception: winrt:hresult_invalid_argument at memory location 0x0C93F1CB
void resume()const{
->_coro_resume(_Ptr);
}

Если я продолжу после исключения, я обнаружу, что ресурс действительно загружен и пригоден для использования,Но если приложение работает за пределами Visual Studio, приложение часто закрывается на этой строке. Может ли быть так, что CanvasVirtualControl не является приемлемым?

Или есть лучший способ загрузить svg из файла? Я не смог определить CanvasDocument LoadFromXML, так как он принимает аргумент System.String, недоступный в C ++ / winrt, а winrt std :: wstring недопустим в качестве замены [Исправление: на самом деле hstring будет работать какаргумент, и это может быть создано из std :: wstring].

[Обновить] Я еще не создал простой демонстрационный проект, показывающий это поведение, но я думаю, что у меня есть линия на причину и хотел бы расширитьмой вопрос. Я пробовал оба метода LoadFromXml и LoadAsync в CanvasSvgDocument, и второй из них был в порядке, но теперь оба метода работают одинаково, и мне кажется, что аргумент ResourceCreator может быть проблемой. Я создаю эти ресурсы в обработчике CreateResources и передаю отправителю - CanvasVirtualControl - в качестве resourceCreator. Однако перечисленным аргументом для обоих вызовов CanvasSvgDocument является ICanvasResourceCreator. Я думал, что это было удобно и что CanvasVirtualControl можно было передать непосредственно для этого аргумента (и так было раньше). Но, возможно, это неверно, может быть, всегда было и сейчас замечается как неправильное? Если это так, как отправитель в обработчике CreateResources правильно будет передан методу CanvasSvgDocument?

...