XAML Namescopes

这一系列是关于在Silverlight1.0中在运行时添加对象的文章。
Using lnline XAML

在Silverlight中,一个namescope存储XAML-defined names of objects和他们等同instance.广义的说它与其他编程语言和技术的"Namescope"相似.Namescope被创建于一个Silverlight应用程序加载XAML Source过程期间.


(1)How Namescopes Are Defined


Namescopes被XAML编译器创建,并且当加载XAML加载的时为XAML元素树结合根元素.特别的是,XAML元素树被定义成单个XAML文件,是个完整的XAML格式.但XAML还能定义成在HTML内Using Inline XAML,或能被使用字符串样输入在运行时的Constructing Objects(在运行时创建对象)的方式,这个方法被使用来在运行时初始化一个Silverlight对象.

每指定一个name就会在XAML内添加一个root namescope.一个name的两个几乎相等的Name or x:Name属性中其中一个被确定设置值.(详细可以看Name or x:Name的区别).如果你试图在任意的Namescope中定义两个相同的名字,就会有异常抛出.

通常,attributes在XAML被指定就是一个对象元素.Property elements (在XAML中被用来为Silverlight properties提供值)不能有一个Name或任意的其他attribute.详细的是XAML语法.


(2)Using Namescopes at RunTime


Names and namescopes允许脚本代码引用最初被XAML定义的对象.编译XAML的内部结论就是创建一个保留一些或全部的已有的XML中的对象的对象集,关于这些关系的维持就像指定已经被创建的对象的属性样,或在Silverlight对象模型中暴露出的有效的方法.常用的有效的方法有FindName.是得到当前的XAML中的一个对象引用.最简单的就是使用FindName方法的返回值,你只要在FindName方法中指定参数名就可以找到相应的对象.FindName能工作于任何领域并在运行时的对象集中找到你想要的实体.你也没有限制非要按父,子节点查找.可是在 Silverlight应用程序中有的方式是定义多个Namescopes.这时使用FindName要达到效果我们会在下面的内容中讨论.

与Namescopes的行为相同,是在XAML内容中定义inline XAML还是一个文件是完全的XAML.Namescope被定义以XMAL部分的根节点为基础,就像一个XAML文件中的根部分一样.


(3)Adding Objects to Silverlight at Run Time with CreateFromXAML


在Silverlight运行时通过CreateFromXAML来添加对象.在Silvelight1.0中,没有一个为使用脚本创建Silverlight对象可用的构造器语法.但是你在XAML片段中定义对象,可以为CreateFromXAML方法输入参数.可以在本XAML片段中的一部分定义对象元素并还能为Name or x:Name定义值.如在这部分XAML中调用CreateFromXAML方法,它会基于这部分XMAL的根接点创建一个的Namescope.它会预先测定已经有的XAML中与提供的Namescope之间要有唯一性.如果这个name在提供的XAML中不是唯一的,CreateFromXAML回抛出错误.可以,如果name在提供的XAML中与已有的Silverlight namescope冲突,不会立即出发错误.这就是因为当CreateFormXAML方法被调用的时候,被创建的对象树返回的不是一个连贯的.你必须清楚你的要连接的对象树,既要添加它到内容属性集如Canvas.Children或其他的的对象所设置的其他的属性值(如为Fil指定一个新的ImageBrush.).你将看到在你试图连接一个不连贯对象树到应用程序的主树对象中name冲突引起错误.方法或属性被使用与试图连接这将是错误的原因,并且连接将失败(你的不连贯树将保留不连贯).


(4)Creating Namescopes with CreateFromXAML


CreateFromXAML有一个可选的参数,createNameScope,通常默认是false.调用CreateFromXAML时明确设置为true,你将创建不连贯的对象树同时它会预先测定已经有的XAML中与提供的Namescope之间要有唯一性.如果这个name在提供的XAML中不是唯一的,CreateFromXAML 会抛出异常.这个行为的出现意味着当连接主应用程序的对象树时想要试图将现有的namescope连接到主程序的namescope就不能哦.所以你的应用程序必须有同一的对象树但不连续的namescopes.一个name通过CreateFromXAML在root定义(与root连接)或一个任意对象在之前的不连贯对象树中已经不能连接到应用程序的namescope中;它已经有自己的不连惯namescope.

 不连续的namescope发行只会影响namescopes使用FindName调用.你还是能在一些case中调用GetParent方法得到上一个不连续阶段,或得到下一个个不连续的阶段的属性集或属性.(如Canvas.Children得到集合).

得到一个被定义不同namescope的对象,你可以使用几个技术.

1:在不连贯阶段爬行完全的树使用GetParent和/或集合属性.
2:如果要从不连贯的namescope中调用主程序的namescope,它可以很容易得到Silverlight plug-in事例子的引用然后调用FindName得到它.脚本如下
returnedObject = object.GetHost().content.FindName("nameToFind");

在这里对象是在不连贯的namescope中调用的对象.这里的.content是Silverlight plug-in sub-object的子对象.再定义FindName方法.

3:如果你想从主要程序namescope中调用一个对象不连贯namescope内的对象,最好的方法之前谈到的在CreateFormXAML方法中保留一个你想要的对象的引用之后添加到树上.这个对象现在是一个有效对象你调就在被创建的不连贯namescope中调用FindName放.你能保持这个对象像全局变量或做为其他方法的参数.

更多深入讨论 Constructing Objects at Run Time

原文地址

转载于:https://www.cnblogs.com/worksguo/archive/2008/03/01/1087255.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值