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

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

最佳答案

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

我的项目名为“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' 是我的应用程序的主 Canvas 的名称。

最后一个小技巧:*.xaml文件的属性'BuildAction'必须设置为'Resource',否则会遇到十六进制值为0x0C的XamlParseException(要更改此属性,请右键单击项目中的文件 TreeView )。

希望对您有所帮助。

关于c# - 在 WPF 应用程序中以编程方式从 XAML 文件加载矢量图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10405339/

相关文章:

c# - 是否有任何等效于使用 C# 限制对一个线程的访问的访问修饰符?

c# - 滚动DataGrid时出现InvalidOperationException : The binding expression already belongs to a BindingGroup

c# - 如何在 ViewModel 中获取控件的高度

c# - Ninject 的装饰器模式

c# - gridview 标题模板中的 foreach 复选框

wpf - 绑定(bind)到组合框时出现 SystemFontFamilies 错误

c# - 我可以处理这个流吗?

c# - 使 WPF 按钮看起来不那么扁平

xaml - Xamarin 中的 "XamlCTask"任务意外失败

wpf - 在WPF中将父高度同步到子高度