Загрузка векторной графики из файлов XAML программным способом в приложении WPF
Я хотел бы загрузить векторную графику, хранящуюся в виде файлов XAML (отдельных файлов, а не в словаре), встроенных в мое приложение, и у меня есть несколько вопросов для этого:
XAML выглядит немного неоднозначно, поскольку его можно использовать для представления статических ресурсов, таких как векторные изображения, или интерфейсов, которые динамически создаются, как в WPF. Из-за этого мне не совсем понятен формат векторного изображения XAML: каким должен быть корневой элемент, например тег "svg" для векторных изображений svg? В настоящее время я использую Canvas в качестве верхнего элемента, поскольку хочу разместить графику в другом Canvas.
Каков наилучший способ загрузки этих файлов программно (я имею в виду создание 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 (чтобы изменить это свойство, щелкните правой кнопкой мыши файл в древовидной структуре проекта).
Надеюсь, это поможет.