杂七杂八——Name与x:Name的关系
小序:
如果想用Google搜包含冒号的内容怎么办?比如我想搜x:Name这个字符串……
原来,应该是这样——x::Name
这世道,连搜索也要加转义,全民程序员,要不要人活了?
正文:
从第一天学习XAML语言开始,我就一直没分清为什么对于一个XAML标签既可以设置它的Name又可以设置它的x:Name。问过一些同事,大家好像对这种比较孔乙己的问题不太感兴趣。今天花了些时间看了看,收获还挺多的。与大家分享一下。
首先,让我们剖析一下XAML代码与C#代码之间的关系。
大家都知道,XAML是“用来设计UI”的,设计师用XAML设计出来的UI其后台代码(程序逻辑)可以由程序员用C#或者VB去写——这叫做Code-behind。实际上,设计师用XAML和程序用C#都是在构建同一个类,换句话说就是:把一个类劈成两半,与UI相关的那半由设计师用XAML写,与逻辑相关的那半由程序员用C#写。
.NET之所以支持这种劈开写的功能,得益于partial这个关键字。请大家看这两段代码
- // For UI
- public partial class Car
- {
- Color bodyColor;
- Color windowColor;
- Polygon door;
- Polygon seat;
- }
- // For logic
- public partial class Car
- {
- public void Accelerate() { /*80, 90... 120, 140....1200...flying...*/}
- public void Break() { /*zizizizizizizizizi....*/ }
- }
- public class Car
- {
- // UI
- Color bodyColor;
- Color windowColor;
- Polygon door;
- Polygon seat;
- // logic
- public void Accelerate() { /*80, 90... 120, 140....1200...flying...*/}
- public void Break() { /*zizizizizizizizizi....*/ }
- }
实际效果是完全一样的。只是前者是把UI和逻辑劈开写,后者是混在一起写罢了。
劈开的确是劈开了,但让设计师用C#代码去实现UI恐怕不现实——让Blend直接生成C#不是不可能是事情,只是C#描述UI太不直观了。于是,微软更进一步,把界面描述语言又向设计师方向推进了一层,也就是XAML语言。于是,开发和设计的格局就变成了这样:
有了XAML和将XAML解析为C#/VB的解析器,设计师们就能以自己最高的工作效率与程序员们合作开发软件了。目前关于XAML是如何解析成C#/VB的资料非常少。
Name揭秘
下面让我们把目光集中在XAML->C#的解析上来,看看Name和x:Name的本质是什么。
让我们看一段代码:
- <