Подтвердить что ты не робот

Загрузка векторной графики из файлов XAML программно в приложение WPF

Я хотел бы загрузить векторную графику, хранящуюся как файлы XAML (отдельные файлы, а не в словаре), встроенные в мое приложение, и у меня есть несколько вопросов для этого:

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

  • Каков наилучший способ загрузки этих файлов программно (я имею в виду, чтобы создать Canvas из файлов xaml)? Я видел (и пытался) различные решения с XamlReader, но ничего не получилось: приложение сработает, и отладчик не помогает (большинство проблем, с которыми я столкнулся, похоже, возникают во время разбора, и сообщение об ошибке было неясным).

Я прочитал http://learnwpf.com/post/2006/06/04/How-do-I-Include-Vector-Based-Image-Resources-in-my-WPF-Application.aspx, но ссылка на статью, касающуюся загрузки файлов ресурсов, не работает, и изображения не создаются используя код С#.

4b9b3361

Ответ 1

Хорошо, я нашел решение самостоятельно, и вот оно:

Мой проект называется "Редактор", и я поместил файл XAML, который я хочу прочитать в папке "Графика". Этот файл называется "Image.xaml". Дерево проекта выглядит следующим образом:

enter image description here

Сам файл XAML содержит этот код:

<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        Width="40" Height="40">
    <Rectangle Canvas.Left="0" Canvas.Top="0" Fill="White" Stroke="Black" StrokeThickness="1" Height="40" Width="40" />
    <!-- ... -->
</Canvas>

(требуется ссылка "xmlns" пространства имен xaml)

Код для загрузки файла:

StreamResourceInfo sr = Application.GetResourceStream(new Uri("Editor;component/Graphics/Image.xaml", UriKind.Relative));
Canvas result = (Canvas)XamlReader.Load(new XmlTextReader(sr.Stream));
layoutRoot.Children.Add(result);

'layoutRoot' - это имя основного холста моего приложения.

Последняя подтема: свойство 'BuildAction' файла *.xaml должно быть установлено в 'Resource', или вы столкнетесь с XamlParseException с шестнадцатеричным значением 0x0C (чтобы изменить это свойство, щелкните правой кнопкой мыши файл в проекте TreeView).

Надеюсь, это поможет.