Wpf 调用XamlReader.Load时引发XamlParseException

Wpf 调用XamlReader.Load时引发XamlParseException,wpf,xaml,.net-4.0,Wpf,Xaml,.net 4.0,我在玩.net 4的System.Windows.Markup.XamlReader——这只是一个教育练习——我一直遇到同样的问题:如果根对象定义了x:Class,则加载带有XamlReader.Load的xaml会引发XamlParseException,但如果没有,则成功解析并加载节点 以下是我正在尝试的代码: using System.Windows; using System.Xaml; using XamlReader = System.Windows.Markup.XamlReade

我在玩.net 4的
System.Windows.Markup.XamlReader
——这只是一个教育练习——我一直遇到同样的问题:如果根对象定义了
x:Class
,则加载带有
XamlReader.Load
的xaml会引发
XamlParseException
,但如果没有,则成功解析并加载节点

以下是我正在尝试的代码:

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...
        }
    }
}
使用System.Windows;
使用System.Xaml;
使用XamlReader=System.Windows.Markup.XamlReader;
命名空间WpfApplication2
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
//从解决方案中加载UserControl1.xaml
var reader=new-XamlXmlReader(@“../../UserControl1.xaml”,XamlReader.GetWpfSchemaContext());
var userControl=XamlReader.Load(reader)为UserControl1;
//使用userControl执行某些操作。。。
}
}
}
我尝试了直接从包含xaml的字符串中解析
XamlReader.Parse
,结果相同:仅在未定义x:Class声明的情况下有效

删除
x:Class
声明似乎不是一个好的选择,因为这样我就丢失了后面的代码,特别是调用
initializeComponent()

例外详细信息:

“指定的类名”WpfApplication2.UserControl1“与实际根实例类型“System.Windows.Controls.UserControl”不匹配。删除Class指令或通过XamlObjectWriterSettings.RootObjectInstance提供实例。“

…但我不知道如何(在哪里)设置
XamlObjectWriterSettings.RootObjectInstance
(或者,如果需要的话?)


有什么线索吗?

XamlReader是解析器,而不是编译器,因此不支持代码隐藏。如果您需要将代码与动态加载的XAML关联,您可以做一些事情,比如将其包装到其他地方定义的控件中,您可以使用XAML中的实例,或者在读取XAML后,将代码(即事件处理程序)连接到结果对象中的元素。

您不能在动态XAML中使用x:Class。相反,您可以做的是在加载XAML之后钩住事件。请看一下这个链接