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

svi*_*ick 27 wpf xaml user-controls

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

由于'UserControl1'在同一程序集中实现,因此必须设置x:Name属性而不是Name属性.

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

slf*_*slf 30

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

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


Ian*_*ose 9

在开始时,编写XAML编译器是为了能够创建.net对象的"树",在Microsoft中有101个使用XAML的项目. XAML编译器对WPF一无所知.

"Name"属性由WPF定义,XAML编译器不知道.WPF将name属性映射为与XAML编译器支持的"Name TAG"相同."x:name"中的"x"表示使用XAML xml架构定义的"name","Name"表示在给定对象上查找名为"name"的属性.请参阅 在WPF中,x:Name和Name属性之间有什么区别?更多细节.

XAML编译器在用户控件的功能上非常有限,无需加载定义用户控件的程序集.由于需要在加载程序集之前编译XAML,因此xaml编译器显然无法加载在同一程序集中实现的控件的程序集.因此,XAML编译器甚至不知道该项是用户控件.

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

XAML编译器只能说"名称未被定义为属性"; 如果确实如此,请考虑有多少人无法使用简单的自定义控件!因此,XAML编译器有一个特殊情况,它通过"猜测"代码的含义来提供更有用的错误消息.它的猜测大多是正确的.

除了最简单的用户控件之外的任何东西都需要在它自己的程序集中,但是用户简单的控制是如此常见,以至于特殊情况被认为是值得的.

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