代码之家  ›  专栏  ›  技术社区  ›  svick Raja Nadar

为什么不能在同一个程序集中使用usercontrol的name属性?

  •  27
  • svick Raja Nadar  · 技术社区  · 16 年前

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

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

    这条信息清楚地说明了如何解决问题,但其原因是什么? 为什么? 我不能用吗? Name 在这里?

    2 回复  |  直到 10 年前
        1
  •  29
  •   slf    16 年前

    x:name只是更明确地表达“这个特定XML名称空间中的name属性”的方式。WPF不能在没有给出这个提示的情况下编译它,因为它在同一个程序集中,这只是它们如何编写解析器的一个限制。

    如果你问为什么是这样,我不确定,因为我没有写。它可能与它有关,需要能够在构建UserControl1(换句话说,catch-22)之前将name属性(read:dependency属性)解析为具体的属性。

        2
  •  9
  •   Community CDub    8 年前

    开始时,为了创建.NET对象的树,编写了XAML编译器,微软内部有101个项目使用了XAML。 XAML编译器对WPF一无所知。

    __name_157;属性由WPF定义,XAML编译器不知道该属性。WPF将name属性映射为与XAML编译器支持的__name标记_157;相同。__x:name_中的__表示使用__name_157;由XAML XML模式定义,__name_157;表示在给定对象上查找名为__name_157;的属性。参见 In WPF, what are the differences between the x:Name and Name attributes? 了解更多详细信息。

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

    因此,无法访问在用户控件(或其父类)上定义的属性。__name_157;是在自定义控件的父级(或父级)中定义的属性。

    XAML编译器可能会说__name未定义为属性_;如果定义为属性_,请考虑有多少人无法使简单的自定义控件正常工作!因此,XAML编译器有一种特殊的情况,通过猜测代码的含义,给出了一条更有用的错误消息。它的猜测基本上是正确的。

    除了最简单的用户控件之外,任何东西都需要在它自己的程序集中,但是用户简单控件是如此常见,以至于一个特殊的情况对它们来说是值得的。

    推荐文章