为什么我不能在同一程序集中的UserControl上使用Name属性?

29 浏览
0 Comments

为什么我不能在同一程序集中的UserControl上使用Name属性?

当我创建了一个WPF的UserControl并尝试使用它时,我遇到了以下编译器错误:

因为\'UserControl1\'被实现在同一个程序集中,所以你必须设置x:Name属性而不是Name属性。

这个消息很清楚地告诉你如何修复它,但是它的原因是什么?为什么我不能在这里使用Name

admin 更改状态以发布 2023年5月20日
0
0 Comments

开始时,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编译器具有一个特殊情况,能够通过“猜测”代码的含义来提供更有用的错误消息,而它的猜测通常是正确的。

除了最简单的用户控件之外的任何内容都需要在自己的程序集中,但是用户简单控件非常常见,因此认为为它们增加特殊情况是值得的。

0
0 Comments

x:Name只是更明确地表示“在此特定XML命名空间中的名称属性”。WPF无法在没有这个提示的情况下编译它的原因仅仅是因为他们编写解析器的方式有限制。

如果你问为什么是这样的,我不确定因为我没有编写过它。它可能与需要在构建UserControl1之前能够将名称属性(即依赖属性)解析为具体内容有关,换句话说,是个死结。

0