抛出XamlParseException调用XamlReader.Load

时间:2011-03-05 05:36:38

标签: wpf xaml .net-4.0

我正在玩.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(或者确实,如果需要的话?)

任何线索?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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

Loading XAML XML through runtime?