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

  Silverlight 中有所谓视觉树(Visual Tree)概念而 VisualTree 是个运行时概念其实可以理解为种 DOM.

  其内容来源可以是几个方面:

  1.静态 XAML 文件中创建

  2.用 XamlReadler.Load 思路方法动态加载 XAML 内容

  3.完全通过代码创建Control控件

  在 XAML 中我们通过 x:Name 来标识个元素但是光靠 Name 不能解决全部问题特别对于些动态场景而言

  有时候我们还需要根据Control控件类型或者其他条件来查找节点

  比如:

  “给我找出当前这个Control控件在哪个 Tab 页(TabItem)中”

  “找出祖先Control控件中谁实现了 IDialogHost 接口(准备显示个对话框加载当前用户Control控件内容)”

  等等类似需求

  于是就有了下面两个思路方法:

  using.Collections.Generic;
  using.Windows;
  using.Windows.Media;
  NeilChen.SilverlightExtensions
  {
  publicDomExtensions
  {
  ///<summary>
  ///查找祖先节点
  ///</summary>
  ///<typeparamname="T">目标节点类型</typeparam>
  ///<paramname="child">起始节点</param>
  ///<s></s>
  publicTFindAncestor<T>(thisDependencyObjectchild)whereT:
  {
  vard=VisualTreeHelper.GetParent(child);
  while(d!=null&&!(disT))
  {
  d=VisualTreeHelper.GetParent(d);
  }
  dasT;
  }
  ///<summary>
  ///查找某种类型子孙节点
  ///</summary>
  ///<typeparamname="T">目标节点类型</typeparam>
  ///<paramname="parent">起始节点</param>
  ///<s>符合条件节点集合</s>
  publicIEnumerable<T>FindChildren<T>(thisDependencyObjectparent)whereT:
  {
  varcount=VisualTreeHelper.GetChildrenCount(parent);
  (count>0)
  {
  for(vari=0;i<count;i)
  {
  varchild=VisualTreeHelper.GetChild(parent,i);
  vart=childasT;
  (t!=null)
  yieldt;
  varchildren=FindChildren<T>(child);
  foreach(variteminchildren)
  yielditem;
  }
  }
  }
  }
  }


  使用思路方法很简单比如(还是拿对话框来举例):

  IDialogHosthost=this.FindAncestor<IDialogHost>;
  (host!=null)
  {
  host.ShowModalDialog(this);
  }


  over.

Tags:  silverlight2 silverlight.2.0 silverlight是什么 silverlight

延伸阅读

最新评论

发表评论