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

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

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

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

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

1 ответ

Решение

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

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

Сам файл 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>

(необходима ссылка на пространство имен xaml 'xmlns')

Код, используемый для загрузки файла:

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 - это имя основного Canvas моего приложения.

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

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

Другие вопросы по тегам