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

Posted

技术标签:

【中文标题】为啥我不能在同一个程序集中使用 UserControl 上的 Name 属性?【英文标题】:Why can't I use the Name attribute on UserControl in the same assembly?为什么我不能在同一个程序集中使用 UserControl 上的 Name 属性? 【发布时间】:2009-09-04 15:56:26 【问题描述】:

当我创建 WPF UserControl 并尝试使用它时,出现以下编译器错误:

因为“UserControl1”是在同一个程序集中实现的,所以您必须设置 x:Name 属性而不是 Name 属性。

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

【问题讨论】:

【参考方案1】:

x:Name 只是一种更明确的说法,即“此特定 XML 命名空间中的名称属性”。 WPF 无法在没有给出此提示的情况下编译它,因为它位于同一个程序集中,这一事实只是他们编写解析器的方式的限制。

如果你问为什么会这样,我不确定,因为不是我写的。它可能与它需要能够在构建 UserControl1 之前将 Name 属性(阅读:依赖属性)解析为具体的东西,换句话说,一个 catch-22。

【讨论】:

【参考方案2】:

最初编写 XAML 编译器是为了能够创建 .net 对象的“树”,微软内部有 101 个项目使用 XAML。 XAML 编译器对 WPF 一无所知。

“名称”属性由 WPF 定义,XAML 编译器不知道。 WPF 将名称属性映射为与 XAML 编译器支持的“名称标签”相同。 “x:name”中的“x”表示使用 XAML xml 架构定义的“名称”,“名称”表示在给定对象上找到名为“名称”的属性。详情请见In WPF, what are the differences between the x:Name and Name attributes?。

XAML 编译器在无需加载定义用户控件的程序集的情况下可以对用户控件执行的操作非常有限。由于需要在加载程序集之前编译 XAML,xaml 编译器显然无法为在同一程序集中实现的控件加载程序集。因此 XAML 编译器甚至不知道该项目是用户控件。

因此无法访问在用户控件(或其父类)上定义的属性。 “名称”是在自定义控件的父级(或超父级)中定义的属性。

XAML 编译器只能说“名称未定义为属性”;如果是这样,想想有多少人无法让一个简单的自定义控件正常工作!因此,XAML 编译器有一个特殊情况,它通过“猜测”代码的含义来提供更有用的错误消息。它的猜测大多是正确的。

除了最简单的用户控件之外的任何东西都需要在其自己的程序集中,但是用户简单控件非常普遍,以至于认为特殊情况对他们来说是值得的。

【讨论】:

'因此无法访问在用户控件(或其父类)上定义的属性。 - 这对我来说没有意义。设置在基类中定义的其他属性<local:UserControl1 Margin="3" />,所以我不明白为什么编译器不能以相同的方式设置Name WPF-property 的值

以上是关于为啥我不能在同一个程序集中使用 UserControl 上的 Name 属性?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 x64 程序集中将复制变量地址移动到寄存器?

服务引用 - 为啥在引用的程序集中重用类型

为啥我无法从与设置文件相同的项目/程序集中为设置选择自定义类型?

为啥我的 Asp.Net Core 日志中出现“不支持 POST 请求”?

为啥框架集中两个子页面不能同时运行settimeout或者setInterval函数

为啥有一个监督树而不是一个集中的监督者?