在WPF应用程序中以编程方式从XAML文件加载矢量图形

tho*_*asc 12 c# wpf xaml vector-graphics xamlreader

我想加载存储为XAML文件的矢量图形(单独的文件,不在字典中),嵌入我的应用程序中,我有几个问题要做:

  1. XAML看起来有点模棱两可,因为它可以用来表示像矢量图像这样的静态资源,或者像WPF中那样动态构建的接口.因此,我不清楚XAML矢量图像的格式:根元素应该是什么,比如svg矢量图像的"svg"标签?目前,我使用Canvas作为顶级元素,因为我想在另一个Canvas中绘制我的图形.

  2. 以编程方式加载这些文件的最佳方法是什么(我的意思是,从xaml文件创建Canvas)?我已经看过(并尝试过)使用XamlReader的不同解决方案,但没有任何效果:应用程序崩溃,调试器没有帮助(我遇到的大多数问题似乎在解析期间发生,并且错误消息不清楚).

我已经阅读http://learnwpf.com/post/2006/06/04/How-do-I-Include-Vector-Based-Image-Resources-in-my-WPF-Application.aspx,但链接到处理资源文件加载的文章已经死亡,图像不是使用C#代码创建的.

tho*_*asc 8

好的,我自己找到了解决方案,这里是:

我的项目名为"Editor",我将想要读取的XAML文件放在"Graphics"文件夹中.该文件名为"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>
Run Code Online (Sandbox Code Playgroud)

(需要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);
Run Code Online (Sandbox Code Playgroud)

'layoutRoot'是我的应用程序的主Canvas的名称.

最后的子功能:*.xaml文件的属性'BuildAction'必须设置为'Resource',否则您将遇到具有十六进制值0x0C的XamlParseException(要更改此属性,请右键单击项目树视图中的文件).

希望这可以提供帮助.