[Silverlight] 写了两个方便 DOM 查找的扩展方法
2008-10-24 11:46:18 来源:WEB开发网Silverlight 中有所谓视觉树(Visual Tree)的概念,而 VisualTree 是一个运行时的概念,其实可以理解为一种 DOM.
其内容的来源可以是几个方面:
1.静态 XAML 文件中创建的。
2.用 XamlReadler.Load() 方法动态加载的 XAML 内容。
3.完全通过代码创建的控件。
在 XAML 中我们通过 x:Name 来标识一个元素,但是光靠 Name 不能解决全部的问题,特别对于一些动态的场景而言。
有时候我们还需要根据控件的类型或者其他条件来查找节点。
比如:
“给我找出当前这个控件在哪个 Tab 页(TabItem)中”
“找出祖先控件中谁实现了 IDialogHost 接口(准备显示一个对话框加载当前用户控件的内容)”
等等类似的需求。
于是就有了下面两个方法:
usingSystem.Collections.Generic;
usingSystem.Windows;
usingSystem.Windows.Media;
namespaceNeilChen.SilverlightExtensions
{
publicstaticclassDomExtensions
{
///<summary>
///查找祖先节点
///</summary>
///<typeparamname="T">目标节点的类型</typeparam>
///<paramname="child">起始节点</param>
///<returns></returns>
publicstaticTFindAncestor<T>(thisDependencyObjectchild)whereT:class
{
vard=VisualTreeHelper.GetParent(child);
while(d!=null&&!(disT))
{
d=VisualTreeHelper.GetParent(d);
}
returndasT;
}
///<summary>
///查找某种类型的子孙节点
///</summary>
///<typeparamname="T">目标节点类型</typeparam>
///<paramname="parent">起始节点</param>
///<returns>符合条件的节点集合</returns>
publicstaticIEnumerable<T>FindChildren<T>(thisDependencyObjectparent)whereT:class
{
varcount=VisualTreeHelper.GetChildrenCount(parent);
if(count>0)
{
for(vari=0;i<count;i++)
{
varchild=VisualTreeHelper.GetChild(parent,i);
vart=childasT;
if(t!=null)
yieldreturnt;
varchildren=FindChildren<T>(child);
foreach(variteminchildren)
yieldreturnitem;
}
}
}
}
}
使用方法很简单。比如(还是拿对话框来举例):
IDialogHosthost=this.FindAncestor<IDialogHost>();
if(host!=null)
{
host.ShowModalDialog(this);
}
over.
Tags:Silverlight 两个 方便
编辑录入:爽爽 [复制链接] [打 印]- ››silverlight全屏显示图片
- ››Silverlight MVVM 模式(一) 切近实战
- ››Silverlight for Windows Phone 7开发系列(1):...
- ››Silverlight for Windows Phone 7开发系列(2):...
- ››Silverlight for Windows Phone 7开发系列(3):...
- ››Silverlight for Windows Phone 7开发系列(4):...
- ››Silverlight for Symbian
- ››Silverlight3系列(四)数据绑定 Data Binding 1
- ››方便实用 通讯管理软件盘点
- ››silverlight2 游戏 1 你能坚持多少秒
- ››Silverlight开发实践--PicZoomShow
- ››Silverlight自定义控件开发 - 令人懊恼的OnApplyT...
赞助商链接