代码之家  ›  专栏  ›  技术社区  ›  xdumaine

x:name在xaml(wpf)中的含义是什么?它与故事板的用法是什么?

  •  5
  • xdumaine  · 技术社区  · 16 年前
    <Border Name="ItemBorder" Margin="5 5 0 5" BorderBrush="Black" BorderThickness="1" Height="75" Width="75">
      <Border.Background>
        <SolidColorBrush x:Name="ItemBorderBrush" Color="LightBlue"/>
      </Border.Background>
      <ContentPresenter/>
    </Border>
    <ControlTemplate.Triggers>
      <EventTrigger RoutedEvent="someEvent">
        <BeginStoryboard>
          <Storyboard TargetName="ItemBorderBrush" TargetProperty="Color" Duration="0:0:1" >
          <!--Storyboard TargetName="ItemBorder" TargetProperty="Background.Color" Duration="0:0:1"> -->
             <ColorAnimation To="White"/>
          </Storyboard>
        </BeginStoryboard>
      </EventTrigger>
    </ControlTemplate.Triggers>
    

    我会尽量解释清楚我的问题。故事板目标名称为“itemborder”(注释掉的行)时会间歇性工作。有时我会得到一个错误,即在作用域中找不到名称“itemborder”。

    我决定遵循这个msdn示例中的样式,直接在画笔上更改color属性,而不是让故事板的目标作为边框,并更改边框的brush by属性的颜色(注释掉的行)。这似乎奏效了。

    然而, Name="ItemBorderBrush" 不编译是因为 Name 不是的属性 SolidColorBrush 所以我用 x:Name="ItemBorderBrush" 两个 名字 和 x:Name 可用于边境。这是为什么?

    什么是 x: 平均(怎么样) X:姓名 不同于 名字 以及为什么 名字 border属性有时只与故事板一起使用?

    2 回复  |  直到 10 年前
        1
  •  4
  •   Justin Niessner    16 年前

    这个 x: 前缀只是从单独的名称空间设置属性:

    在命名空间声明中 许多XAML文件的根标记,您 会看到通常有两个 XML命名空间声明。第一个 声明映射了整个WPF 客户端/框架XAML命名空间为 默认值:

    xmlns=“http://schemas.microsoft.com/winfx/2006/xaml/presentation”

    第二个声明将 XAML命名空间,映射它(通常) 到x:前缀。

    xmlns:x=“http://schemas.microsoft.com/winfx/2006/xaml”

    它们之间的关系 声明是x:前缀 映射支持 是XAML语言的一部分 定义,而wpf是一个 使用XAML作为 语言和定义的词汇 它的对象用于XAML。因为WPF 词汇的用法会多得多。 比XAML内部函数更常见 用法,WPF词汇表被映射 作为默认值

    所以,原因是 Name 和 x:Name 这两种方法都适用于border,因为border有一个名为name的属性。它还支持 X:姓名 (这是WPF用来创建类的命名实例的方法)。

    但是,solidColorBrush没有名为name的属性,因此它只支持 X:姓名 .

        2
  •  1
  •   Community Mohan Dere    9 年前

    XAML中实际上只有一个名称x:name。框架(如wpf)可以选择将其属性之一映射到xaml的x:name,方法是在类上使用runtimenamepropertyattribute,该属性将其中一个类属性指定为映射到xaml的x:name属性。

    这样做的原因是允许框架在运行时已经有了“名称”的概念,比如wpf。例如,在WPF中,frameworkelement引入了name属性。

    通常,类不需要存储x:name的名称即可使用。xaml的所有x:name意味着生成一个字段来将值存储在代码隐藏类中。运行时对该映射所做的操作依赖于框架。

    那么,为什么有两种方法来做同样的事情呢?简单的答案是因为有两个概念映射到一个属性上。wpf希望在运行时保留元素的名称(可以通过bind等方式使用),而xaml需要知道您希望代码隐藏类中的字段能够访问哪些元素。wpf通过将name属性标记为x:name的别名将这两个属性联系在一起。

    将来,xaml将对x:name有更多的用途,例如允许您通过按名称引用其他对象来设置属性,但在3.5及更高版本中,它仅用于创建字段。

    你应该使用一个还是另一个确实是一个风格问题,而不是技术问题。我会把它留给别人推荐。

    另请参见automationproperties.name与x:name、automationproperties.name由辅助工具和一些测试工具使用。

    参考 In WPF, what are the differences between the x:Name and Name attributes?