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

12

我想要加载作为XAML文件存储的矢量图形(单独的文件,不在字典中),并有一些问题需要解决:

  1. XAML看起来有点模糊,因为它可以用于表示静态资源(如矢量图像)或正在动态构建的界面(例如WPF中的界面)。因此,对于XAML矢量图像的格式不清楚:应该是什么根元素,例如SVG矢量图像的“svg”标签?目前,我使用Canvas作为顶级元素,因为我想在另一个Canvas中绘制我的图形。

  2. 最佳方法是以编程方式加载这些文件(也就是从xaml文件创建画布)?我已经尝试了不同的解决方案使用XamlReader,但没有任何作用:应用程序崩溃,调试器也没有帮助(我遇到的大多数问题似乎发生在解析过程中,而错误消息不清楚)。

我阅读了http://learnwpf.com/post/2006/06/04/How-do-I-Include-Vector-Based-Image-Resources-in-my-WPF-Application.aspx,但负责资源文件加载的文章链接已经失效了,而且这些图片并不是使用C#代码创建的。


12
很棒你找到了解决方案并与大家分享,如果你能将解决方案作为答案添加并接受它作为答案,而不是将其添加到问题中,这将更有帮助。 - akjoshi
1个回答

8

好的,我自己找到了解决方案,以下是解决方法:

我的项目名为“Editor”,我将要读取的XAML文件放在一个名为“Graphics”的文件夹中。这个文件名叫做“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>

需要使用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' 是我应用程序的主画布的名称。
最后一个细节:*.xaml 文件的 'BuildAction' 属性必须设置为 'Resource',否则您将遇到 XamlParseException,十六进制值为 0x0C(要更改此属性,请在项目树视图中右键单击文件)。
希望这可以帮助您。

在MainWindow.xaml中,您使用什么代码来引用C#? - Hoby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接