我正在尝试xaml 4的System.Windows.Markup.XamlReader -只是作为一个教育练习-我一直遇到相同的问题:如果根对象定义了XamlParseException,则用XamlReader.Load加载x:Class会抛出XamlParseException,但如果根对象定义了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.'
...but我不知道如何(在哪里)设置XamlObjectWriterSettings.RootObjectInstance (或者实际上,如果需要的话?)
有什么线索吗?
发布于 2011-03-05 14:02:00
XamlReader是一个解析器,而不是一个编译器,所以不支持代码隐藏。如果您需要将代码与动态加载的XAML相关联,您可以这样做:将其包装到在其他地方定义的控件中,您可以在XAML中使用该控件的实例,或者在读取XAML之后,将代码(即事件处理程序)连接到结果对象中的元素。
发布于 2011-03-05 14:23:53
不能在动态XAML中使用x:Class。相反,您可以在加载XAML之后挂接事件。请看一下这个链接
https://stackoverflow.com/questions/5201937
复制相似问题