为什么我不能在同一程序集中的UserControl上使用Name属性?
为什么我不能在同一程序集中的UserControl上使用Name属性?
当我创建了一个WPF的UserControl
并尝试使用它时,我遇到了以下编译器错误:
因为\'UserControl1\'被实现在同一个程序集中,所以你必须设置x:Name属性而不是Name属性。
这个消息很清楚地告诉你如何修复它,但是它的原因是什么?为什么我不能在这里使用Name
?
admin 更改状态以发布 2023年5月20日
开始时,XAML编译器是为了创建.NET对象的“树形结构”而编写的,微软的101个项目都使用了XAML。XAML编译器不知道任何关于WPF的东西。
“Name”属性是由WPF定义的,XAML编译器不知道它。WPF将名称属性映射为与XAML编译器支持的“名称标签”相同。 “x:name”中的“x”表示使用XAML XML架构中定义的“name”,“Name”表示在给定对象上查找一个名为“name”的属性。具体详情请参见WPF中x:Name和Name属性有什么区别?。
没有加载定义用户控件的程序集,XAML编译器在操作用户控件时的能力非常受限。由于必须在加载程序集之前编译XAML,因此XAML编译器显然无法加载实现在同一程序集中的控件的程序集。因此,XAML编译器甚至不知道该项是用户控件。
因此,无法访问自定义控件(或其父类)上定义的属性。“Name”是在自定义控件的父类(或超级父类)中定义的属性。
如果XAML编译器只是说“Name未定义为属性”,那么考虑一下有多少人无法使简单的自定义控件正常工作!因此,XAML编译器具有一个特殊情况,能够通过“猜测”代码的含义来提供更有用的错误消息,而它的猜测通常是正确的。
除了最简单的用户控件之外的任何内容都需要在自己的程序集中,但是用户简单控件非常常见,因此认为为它们增加特殊情况是值得的。