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# 代码创建的。

4

1 回答 1

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>

(需要 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 的名称。

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

希望这能有所帮助。

于 2012-07-14T21:36:30.437 回答