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.
在开始时,编写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编译器有一个特殊情况,它通过"猜测"代码的含义来提供更有用的错误消息.它的猜测大多是正确的.
除了最简单的用户控件之外的任何东西都需要在它自己的程序集中,但是用户简单的控制是如此常见,以至于特殊情况被认为是值得的.
| 归档时间: |
|
| 查看次数: |
10558 次 |
| 最近记录: |