我正在玩.net 4的System.Windows.Markup.XamlReader
- 只是作为一项教育练习 - 而且我一直遇到同样的问题:用XamlReader.Load
加载xaml会抛出XamlParseException
root对象定义了x:Class
,但如果没有,则成功解析并加载该节点。
这是我正在尝试的代码:
using System.Windows;
using System.Xaml;
using XamlReader = System.Windows.Markup.XamlReader;
namespace WpfApplication2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// Load up UserControl1.xaml from the solution
var reader = new XamlXmlReader(@"../../UserControl1.xaml", XamlReader.GetWpfSchemaContext());
var userControl = XamlReader.Load(reader) as UserControl1;
// Do something with userControl...
}
}
}
我直接从保存xaml的字符串中尝试XamlReader.Parse
,结果相同:只有在没有定义x:Class声明的情况下才有效。
删除x:Class
声明似乎不是一个好选择,因为我失去了代码隐藏,特别是对InitalizeComponent()
的调用
异常细节:
'Specified class name 'WpfApplication2.UserControl1' doesn't match actual root instance type 'System.Windows.Controls.UserControl'. Remove the Class directive or provide an instance via XamlObjectWriterSettings.RootObjectInstance.'
...但我不知道如何(在哪里)设置XamlObjectWriterSettings.RootObjectInstance
(或者确实,如果需要的话?)
任何线索?
答案 0 :(得分:6)
XamlReader是一个解析器,而不是编译器,所以不支持代码隐藏。如果您需要将代码与动态加载的XAML相关联,您可以执行类似的操作,例如将其包装到其他地方定义的控件中,您可以使用XAML中的实例,或者在读取XAML后,连接代码(即事件处理程序) )到结果对象中的元素。
答案 1 :(得分:5)
您不能在动态XAML中使用x:Class。相反,你可以做的是你可以在加载XAML后挂钩事件。请看一下这个链接