WEB开发网
开发学院图形图像Flash [Silverlight] 写了两个方便 DOM 查找的扩展方法 阅读

[Silverlight] 写了两个方便 DOM 查找的扩展方法

 2008-10-24 11:46:18 来源:WEB开发网   
核心提示:Silverlight 中有所谓视觉树(Visual Tree)的概念,而 VisualTree 是一个运行时的概念,[Silverlight] 写了两个方便 DOM 查找的扩展方法,其实可以理解为一种 DOM.其内容的来源可以是几个方面:1.静态 XAML 文件中创建的,2.用 XamlReadler.Load()

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 两个 方便

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接