如何在C#代码中从字符串资源创建WPF SVG转XAML控件并添加到Canvas
如何从XAML字符串资源创建控件并添加到Canvas?
嘿,你之前的代码思路有点走偏啦——把XAML字符串设为DataContext是没法渲染出实际UI的,因为DataContext是用来绑定业务数据的,可不是用来加载UI结构的。咱们得用WPF的XAML解析器,把字符串形式的XAML转换成真实的控件对象才行。
问题根源
你原来的代码只是创建了一个空的UserControl,把XAML字符串丢给了它的DataContext,但这个控件的Content还是空的,自然看不到任何内容。正确的做法是直接解析XAML字符串,生成包含所有SVG转绘元素的控件实例。
解决步骤
- 引用必要的命名空间:首先要确保你的代码文件引用了
System.Windows.Markup,因为XamlReader类就在这个命名空间里。 - 解析XAML字符串:用
XamlReader.Parse()方法把资源里的XAML字符串转换成对应的UserControl对象。 - 设置位置并添加到Canvas:给解析好的控件设置Canvas中的位置,再添加到Canvas的子元素集合里。
完整代码示例
using System.Windows.Markup; // ... 其他需要的命名空间 // 获取资源中的XAML字符串 string printerXaml = Resource1.ResourceManager.GetString("printer"); if (!string.IsNullOrEmpty(printerXaml)) { try { // 解析XAML字符串,生成UserControl实例 UserControl printerControl = (UserControl)XamlReader.Parse(printerXaml); // 设置控件在Canvas中的位置 Canvas.SetLeft(printerControl, 150); Canvas.SetTop(printerControl, 150); // 将控件添加到Canvas中 front_canvas.Children.Add(printerControl); } catch (Exception ex) { // 处理XAML解析失败的情况(比如格式错误) MessageBox.Show($"加载打印图标失败:{ex.Message}"); } }
额外提示
- 如果你的XAML根元素不是
UserControl(比如是Canvas或者Viewbox),记得把类型转换改成对应的类型。 - 确保你的XAML字符串是完整且格式正确的——从你提供的片段来看,转换后的XAML结构是没问题的,但要注意不要遗漏闭合标签。
内容的提问来源于stack exchange,提问作者user3768730
相关产品推荐
相关产品推荐

