本文转载自silvergingko的专栏

在Xaml中定义了一个元素后,如果后面要使用该元素,则必须为该元素定义一个元素名称,在随后的Xaml中,通过元素名称来使用该元素。

在Xaml中,元素的名称定义有两种方式:

1、通过Xaml的标记特性x:Name指定;

2、通过WPF的依赖项属性Name指定。

  1. <!--Xaml code-->
  2. <StackPanel Name="stackPanel">
  3. <!--在StackPanel中定义两个椭圆,并为它们指定名称为ellipseOne和ellipseTwo,
  4. 使用不同的填充色来区别这两个椭圆。随后的两个椭圆ellipseThree和ellipseFour,
  5. 它们的填充色分别与ellipseOne和ellipseTwo对应,通过WPF绑定机制实现-->
  6. <Ellipse x:Name="ellipseOne" Fill="AliceBlue" Width="50" Height="50"/>
  7. <Ellipse Name="ellipseTwo" Fill="AntiqueWhite" Width="50" Height="50"/>
  8. <Ellipse Name="ellipseThree" Width="50" Height="50"
  9. Fill="{Binding ElementName=ellipseOne, Path=Fill}"/>
  10. <Ellipse Name="ellipseFour" Width="50" Height="50"
  11. Fill="{Binding ElementName=ellipseTwo, Path=Fill}"/>
  12. </StackPanel>

当加载窗口时,响应窗口加载的Loaded事件,添加处理过程 Window_Loaded,在处理过程中通过代码,创建另外两个椭圆,

这两个椭圆ellipseFive和ellipseSix的填充色,也分别使用的是ellipseOne和ellipseTwo的填充色:

  1. //C# code
  2. private void Window_Loaded(object sender, RoutedEventArgs e)
  3. {
  4. //定义两个椭圆,并使用ellipseOne和ellipseTwo的填充色来分别填充这两个椭圆
  5. Ellipse ellipseFive = new Ellipse();
  6. Ellipse ellipseSix = new Ellipse();
  7. ellipseFive.Fill = ellipseOne.Fill;
  8. ellipseFive.Width = 50;
  9. ellipseFive.Height = 50;
  10. ellipseSix.Fill = ellipseTwo.Fill;
  11. ellipseSix.Width = 50;
  12. ellipseSix.Height = 50;
  13. stackPanel.Children.Add(ellipseFive);
  14. stackPanel.Children.Add(ellipseSix);
  15. }

运行时截图:

在以上的例子中,可以发现无论是通过x:Name还是Name来定义椭圆的名称,代码都能正常工作。因此,一般情况下,使用x:Name,还是Name,并无讲究。

x:Name与Name有两个不同点:

1、x:Name是Xaml的标记特性,任何在Xaml中定义的元素,都可以使用x:Name来为元素指定名称。

Name是FrameworkElement定义的依赖项属性(String类型),只有FrameworkElement的派生类才可以使用Name。

例如,Ellipse的Fill属性的类型是Brush,Brush不是FrameworkElement的子类,它没有Name属性。

因此,在Xaml中,为Brush指定名称时,只能使用x:Name标记特性:

  1. <!--Xaml code-->
  2. <Ellipse>
  3. <Ellipse.Fill>
  4. <SolidColorBrush x:Name="aliceBlue" Color="AliceBlue"/>
  5. <!--注销上面一行的代码,使用下面一行的代码无法通过编译-->
  6. <!--<SolidColorBrush Name="aliceBlue" Color="AliceBlue"/>-->
  7. </Ellipse.Fill>
  8. </Ellipse>

2、在FrameworkElement的定义中,添加了System.Windows.Markup.RuntimeNamePropertyAttribute特性:

  1. //C# code
  2. [RuntimeNamePropertyAttribute("Name")]

该特性的作用是,当在Xaml中,使用x:Name后,该值将被自动赋给FrameworkElement的Name属性。

可以使用RuntimeNamePropertyAttribut,为自己定义的类添加名称特性:

  1. //C# code
  2. [RuntimeNamePropertyAttribute("Nickname")]
  3. public class Person : UIElement
  4. {
  5. public String Nickname { get; set; }
  6. public String Name { get; set; }
  7. }
  1. <!--Xaml code-->
  2. <StackPanel>
  3. <Zyj:Person x:Name="小李探花"/>
  4. <TextBlock>Name:</TextBlock>
  5. <TextBlock Text="{Binding ElementName=小李探花, Path=Name}"/>
  6. <TextBlock>Nickname:</TextBlock>
  7. <TextBlock Text="{Binding ElementName=小李探花, Path=Nickname}"/>
  8. </StackPanel>

运行时截图:

在以上的例子中,Xaml中定义了一个Person元素,使用x:Name指定该元素为“小李探花”,在两个TextBlock中分别显示“小李探花.Name” 和“小李探花.Nickname”,

因为在Person的类定义中,将RuntimeNamePropertyAttribut特性指定到“Nickname”,因此x:Name的值被赋予给了Nickname属性。

RuntimeNamePropertyAttribut特性只能在类定义中使用:

  1. //C# code
  2. [AttributeUsageAttribute(AttributeTargets.Class)]
  3. public sealed class RuntimeNamePropertyAttribute : Attribute

RuntimeNamePropertyAttribut特性指定的属性可以是一般属性,依赖项属性不是必须的,尽管FrameworkElement.Name是一个依赖项属性。

在自己的类定义中,如果使用RuntimeNamePropertyAttribut特性,一般情况下,将它指定到类的Name属性,同FrameworkElement保持一致。

除了FrameworkElement类定义了Name属性以外,FrameworkContentElement也定义了Name属性,并使用了RuntimeNamePropertyAttribute特性。

x:Name标记特性与Name属性的更多相关文章

  1. MVC4 数据验证、特性、自动属性总结

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    最近在做自学MVC,遇到的问题很多,索性一点点总结 ...

  2. JS 4 新特性:混合属性(mixins)

    Ext JS4的新特征1:混合属性(mixins) 组合是Extjs4的新特性,可用于实现多继承的情况.该属性会以同步方式加载类文件,并实例化该类(译者推理其内部使用Ext.create方法).直接上 ...

  3. PHP 提取图片img标记中的任意属性

    PHP 提取图片img标记中的任意属性的简单实例. 复制代码代码如下: <?php /* PHP正则提取图片img标记中的任意属性 */ $str = '<center><im ...

  4. DOM元素的Attribute(特性)和Property(属性) 【转载】

    1.介绍: 上篇js便签笔记http://www.cnblogs.com/wangfupeng1988/p/3626300.html最后提到了dom元素的Attribute和Property,本文简单 ...

  5. 理解特性attribute 和 属性property的区别 及相关DOM操作总结

    查一下英语单词解释,两个都可以表示属性.但attribute倾向于解释为特质,而property倾向于解释私有的.这个property的私有解释可以更方便我们下面的理解. 第一部分:区别点 第一点:  ...

  6. PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性。

    PHP正则提取或替换img标记属性 PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性.   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  7. AngularJS 中特性(attr)和属性(prop)的区别

    attr() 和 removeAttr() 方法是对特性进行处理的, 而 prop() 是对属性进行操作的 , 但是很多时候操作的东西是同一个 , 但是也是有区别的, 区别在于prop方法处理的是被 ...

  8. JavaScript的检测属性、属性特性、枚举属性

    /* 检测属性 检测属性可以通过三种方式 1.通过in运算符 2.通过hasOwnPerperty() 如果给定的属性是继承属性将返回false 3.通过propertyIsEnumerable(): ...

  9. 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定

    最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...

随机推荐

  1. 在 Visual Studio 2013 中创建 ASP.NET Web 项目(1):概述 - 创建 Web 应用程序项目

    注:本文是“在 Visual Studio 2013 中创建 ASP.NET Web 项目”专题的一部分,详情参见 专题导航 . 预备知识 本专题适用于 Visual Studio 2013 及以上版 ...

  2. js获取select改变事件

    js获取select改变事件onchage前的值 和 onclick事件 <select id="wupin_id" name="wupin_id" on ...

  3. 【ZOJ 3870】 Team Formation

    题意 n个数,找出有几对a.b 符合 a ^ b > max(a,b) .^表示异或号 分析 对于数a,如果它的二进制是: 1 0 1  0 0 1,那么和它 ^ 后 能比他大的数就是: 0 1 ...

  4. 【LightOJ 1422】Halloween Costumes(区间DP)

    题 题意 告诉我们每天要穿第几号衣服,规定可以套好多衣服,所以每天可以套上一件新的该号衣服,也可以脱掉一直到该号衣服在最外面.求最少需要几件衣服. 分析 DP,dp[i][j]表示第i天到第j天不脱第 ...

  5. 【BZOJ-1965】SHUFFLE 洗牌 快速幂 + 拓展欧几里德

    1965: [Ahoi2005]SHUFFLE 洗牌 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 541  Solved: 326[Submit][St ...

  6. TCP/IP详解 学习二

    链路层: 在 T C P / I P协议族中,链路层主要有三个目的:(1)为 I P模块发送和接收 I P数据报:( 2)为 A R P模块发送 A R P请求和接收 A R P应答:( 3)为 R ...

  7. hihocoder #1285 智力竞赛

    传送门 总结: 1.仔细读题 2.仔细分析复杂度 3.不要想当然,乱下结论 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi.小Ho还有被小Hi强拉来的小Z,准备组队 ...

  8. Selenium2+python自动化13-Alert

    不是所有的弹出框都叫alert,在使用alert方法前,先要识别出它到底是不是alert.先认清楚alert长什么样子,下次碰到了,就可以用对应方法解决.alert\confirm\prompt弹出框 ...

  9. ExtJS入门教程01,Window如此简单,你怎能不会?

    这是一系列ExtJS教程,今天的是第一篇,主要介绍ExtJS中Window的基本用法.希望大家能够支持! 来吧,创建一个漂亮的弹出窗 var win = Ext.create("Ext.Wi ...

  10. tp三大自动

    ThinkPHP三大自动 (2012-03-21 10:48:56) 转载▼ 标签: thinkphp 三大自动 自动验证 自动完成 自动填充 自动映射 字段映射 杂谈 分类: php 一.自动验证 ...