x:Name标记特性与Name属性
本文转载自silvergingko的专栏
在Xaml中定义了一个元素后,如果后面要使用该元素,则必须为该元素定义一个元素名称,在随后的Xaml中,通过元素名称来使用该元素。
在Xaml中,元素的名称定义有两种方式:
1、通过Xaml的标记特性x:Name指定;
2、通过WPF的依赖项属性Name指定。
- <!--Xaml code-->
- <StackPanel Name="stackPanel">
- <!--在StackPanel中定义两个椭圆,并为它们指定名称为ellipseOne和ellipseTwo,
- 使用不同的填充色来区别这两个椭圆。随后的两个椭圆ellipseThree和ellipseFour,
- 它们的填充色分别与ellipseOne和ellipseTwo对应,通过WPF绑定机制实现-->
- <Ellipse x:Name="ellipseOne" Fill="AliceBlue" Width="50" Height="50"/>
- <Ellipse Name="ellipseTwo" Fill="AntiqueWhite" Width="50" Height="50"/>
- <Ellipse Name="ellipseThree" Width="50" Height="50"
- Fill="{Binding ElementName=ellipseOne, Path=Fill}"/>
- <Ellipse Name="ellipseFour" Width="50" Height="50"
- Fill="{Binding ElementName=ellipseTwo, Path=Fill}"/>
- </StackPanel>
当加载窗口时,响应窗口加载的Loaded事件,添加处理过程 Window_Loaded,在处理过程中通过代码,创建另外两个椭圆,
这两个椭圆ellipseFive和ellipseSix的填充色,也分别使用的是ellipseOne和ellipseTwo的填充色:
- //C# code
- private void Window_Loaded(object sender, RoutedEventArgs e)
- {
- //定义两个椭圆,并使用ellipseOne和ellipseTwo的填充色来分别填充这两个椭圆
- Ellipse ellipseFive = new Ellipse();
- Ellipse ellipseSix = new Ellipse();
- ellipseFive.Fill = ellipseOne.Fill;
- ellipseFive.Width = 50;
- ellipseFive.Height = 50;
- ellipseSix.Fill = ellipseTwo.Fill;
- ellipseSix.Width = 50;
- ellipseSix.Height = 50;
- stackPanel.Children.Add(ellipseFive);
- stackPanel.Children.Add(ellipseSix);
- }
运行时截图:

在以上的例子中,可以发现无论是通过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标记特性:
- <!--Xaml code-->
- <Ellipse>
- <Ellipse.Fill>
- <SolidColorBrush x:Name="aliceBlue" Color="AliceBlue"/>
- <!--注销上面一行的代码,使用下面一行的代码无法通过编译-->
- <!--<SolidColorBrush Name="aliceBlue" Color="AliceBlue"/>-->
- </Ellipse.Fill>
- </Ellipse>
2、在FrameworkElement的定义中,添加了System.Windows.Markup.RuntimeNamePropertyAttribute特性:
- //C# code
- [RuntimeNamePropertyAttribute("Name")]
该特性的作用是,当在Xaml中,使用x:Name后,该值将被自动赋给FrameworkElement的Name属性。
可以使用RuntimeNamePropertyAttribut,为自己定义的类添加名称特性:
- //C# code
- [RuntimeNamePropertyAttribute("Nickname")]
- public class Person : UIElement
- {
- public String Nickname { get; set; }
- public String Name { get; set; }
- }
- <!--Xaml code-->
- <StackPanel>
- <Zyj:Person x:Name="小李探花"/>
- <TextBlock>Name:</TextBlock>
- <TextBlock Text="{Binding ElementName=小李探花, Path=Name}"/>
- <TextBlock>Nickname:</TextBlock>
- <TextBlock Text="{Binding ElementName=小李探花, Path=Nickname}"/>
- </StackPanel>
运行时截图:

在以上的例子中,Xaml中定义了一个Person元素,使用x:Name指定该元素为“小李探花”,在两个TextBlock中分别显示“小李探花.Name” 和“小李探花.Nickname”,
因为在Person的类定义中,将RuntimeNamePropertyAttribut特性指定到“Nickname”,因此x:Name的值被赋予给了Nickname属性。
RuntimeNamePropertyAttribut特性只能在类定义中使用:
- //C# code
- [AttributeUsageAttribute(AttributeTargets.Class)]
- public sealed class RuntimeNamePropertyAttribute : Attribute
RuntimeNamePropertyAttribut特性指定的属性可以是一般属性,依赖项属性不是必须的,尽管FrameworkElement.Name是一个依赖项属性。
在自己的类定义中,如果使用RuntimeNamePropertyAttribut特性,一般情况下,将它指定到类的Name属性,同FrameworkElement保持一致。
除了FrameworkElement类定义了Name属性以外,FrameworkContentElement也定义了Name属性,并使用了RuntimeNamePropertyAttribute特性。
x:Name标记特性与Name属性的更多相关文章
- MVC4 数据验证、特性、自动属性总结
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 最近在做自学MVC,遇到的问题很多,索性一点点总结 ...
- JS 4 新特性:混合属性(mixins)
Ext JS4的新特征1:混合属性(mixins) 组合是Extjs4的新特性,可用于实现多继承的情况.该属性会以同步方式加载类文件,并实例化该类(译者推理其内部使用Ext.create方法).直接上 ...
- PHP 提取图片img标记中的任意属性
PHP 提取图片img标记中的任意属性的简单实例. 复制代码代码如下: <?php /* PHP正则提取图片img标记中的任意属性 */ $str = '<center><im ...
- DOM元素的Attribute(特性)和Property(属性) 【转载】
1.介绍: 上篇js便签笔记http://www.cnblogs.com/wangfupeng1988/p/3626300.html最后提到了dom元素的Attribute和Property,本文简单 ...
- 理解特性attribute 和 属性property的区别 及相关DOM操作总结
查一下英语单词解释,两个都可以表示属性.但attribute倾向于解释为特质,而property倾向于解释私有的.这个property的私有解释可以更方便我们下面的理解. 第一部分:区别点 第一点: ...
- 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 ...
- AngularJS 中特性(attr)和属性(prop)的区别
attr() 和 removeAttr() 方法是对特性进行处理的, 而 prop() 是对属性进行操作的 , 但是很多时候操作的东西是同一个 , 但是也是有区别的, 区别在于prop方法处理的是被 ...
- JavaScript的检测属性、属性特性、枚举属性
/* 检测属性 检测属性可以通过三种方式 1.通过in运算符 2.通过hasOwnPerperty() 如果给定的属性是继承属性将返回false 3.通过propertyIsEnumerable(): ...
- 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定
最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...
随机推荐
- poj1470 LCA Tarjan
比较直接的题目,入门一下. #include<map> #include<queue> #include<stack> #include<cmath> ...
- fluery算法
#include<stdio.h> #include<string.h> struct stack { int top; ]; }s; ][]; void dfs(int x) ...
- shell expr的用法
root@tcx4440-03:~# var=$var+1root@tcx4440-03:~# echo $var3+1 要想达到预期结果,用下列三种方法: (1)let "var+=1&q ...
- 【kAri OJ】wzt的树
时间限制 1000 ms 内存限制 65536 KB 题目描述 改革春风吹满地,中国人民真争气!家庭联产承包责任制以后,全国人民争想发家致富.wzt于是包了一个山头来种植金丝楠木,花了好几年种了N棵树 ...
- python 变量命名规范
python源码和其他一些书籍,命名各种个性,没有一个比较统一的命名规范.于是总结了一些,供参考. 模块名: 模块应该使用尽可能短的.全小写命名,可以在模块命名时使用下划线以增强可读性.同样包的命名也 ...
- poj3207 2-SAT入门
一开始题意没读懂 = = 题意:比如说对于表盘上a到b.c到d都要连边,这两个边不能交叉.这两个边要么都在圆内要么都在圆外,而且可以是曲线= = 比如这种情况:(Reference:http://bl ...
- cogs896 圈奶牛
描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. PROGRAM NAM ...
- Linux VPS新硬盘分区与挂载教程
通过fdisk -l我们可以看到/dev/xvdb(此名称因系统而异)容量有23.6G,而且没有分区,接下来我们对它进行分区和挂载 (红色字为需要输入的部分,黑色字为系统显示部分) 1.fdisk - ...
- dedecms最新版本修改任意管理员漏洞
此漏洞无视gpc转义,过80sec注入防御. 补充下,不用担心后台找不到.这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL? 起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏 ...
- Netbeans连接数据库
/* Netbeans连接数据库 NetBeans项目的“项目属性”中“库”一栏中.Tab页“编译和运行”中已经加上jdbc的驱动文件 */ Connection conn = null;//连接数据 ...