[Silverlight] 写了两个方便 DOM 查找的扩展方法
来源:互联网 发布:淘宝欧时力代购真假 编辑:程序博客网 时间:2024/06/05 14:51
Silverlight 中有所谓视觉树(Visual Tree)的概念,而 VisualTree 是一个运行时的概念,其实可以理解为一种 DOM.
其内容的来源可以是几个方面:
1.静态 XAML 文件中创建的。
2.用 XamlReadler.Load() 方法动态加载的 XAML 内容。
3.完全通过代码创建的控件。
在 XAML 中我们通过 x:Name 来标识一个元素,但是光靠 Name 不能解决全部的问题,特别对于一些动态的场景而言。
有时候我们还需要根据控件的类型或者其他条件来查找节点。
比如:
“给我找出当前这个控件在哪个 Tab 页(TabItem)中”
“找出祖先控件中谁实现了 IDialogHost 接口(准备显示一个对话框加载当前用户控件的内容)”
等等类似的需求。
于是就有了下面两个方法:
使用方法很简单。比如(还是拿对话框来举例):
over.
其内容的来源可以是几个方面:
1.静态 XAML 文件中创建的。
2.用 XamlReadler.Load() 方法动态加载的 XAML 内容。
3.完全通过代码创建的控件。
在 XAML 中我们通过 x:Name 来标识一个元素,但是光靠 Name 不能解决全部的问题,特别对于一些动态的场景而言。
有时候我们还需要根据控件的类型或者其他条件来查找节点。
比如:
“给我找出当前这个控件在哪个 Tab 页(TabItem)中”
“找出祖先控件中谁实现了 IDialogHost 接口(准备显示一个对话框加载当前用户控件的内容)”
等等类似的需求。
于是就有了下面两个方法:
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media;
namespace NeilChen.SilverlightExtensions
{
public static class DomExtensions
{
/// <summary>
/// 查找祖先节点
/// </summary>
/// <typeparam name="T">目标节点的类型</typeparam>
/// <param name="child">起始节点</param>
/// <returns></returns>
public static T FindAncestor<T>(this DependencyObject child) where T : class
{
var d = VisualTreeHelper.GetParent(child);
while (d != null && !(d is T))
{
d = VisualTreeHelper.GetParent(d);
}
return d as T;
}
/// <summary>
/// 查找某种类型的子孙节点
/// </summary>
/// <typeparam name="T">目标节点类型</typeparam>
/// <param name="parent">起始节点</param>
/// <returns>符合条件的节点集合</returns>
public static IEnumerable<T> FindChildren<T>(this DependencyObject parent) where T : class
{
var count = VisualTreeHelper.GetChildrenCount(parent);
if (count > 0)
{
for (var i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
var t = child as T;
if (t != null)
yield return t;
var children = FindChildren<T>(child);
foreach (var item in children)
yield return item;
}
}
}
}
}
using System.Windows;
using System.Windows.Media;
namespace NeilChen.SilverlightExtensions
{
public static class DomExtensions
{
/// <summary>
/// 查找祖先节点
/// </summary>
/// <typeparam name="T">目标节点的类型</typeparam>
/// <param name="child">起始节点</param>
/// <returns></returns>
public static T FindAncestor<T>(this DependencyObject child) where T : class
{
var d = VisualTreeHelper.GetParent(child);
while (d != null && !(d is T))
{
d = VisualTreeHelper.GetParent(d);
}
return d as T;
}
/// <summary>
/// 查找某种类型的子孙节点
/// </summary>
/// <typeparam name="T">目标节点类型</typeparam>
/// <param name="parent">起始节点</param>
/// <returns>符合条件的节点集合</returns>
public static IEnumerable<T> FindChildren<T>(this DependencyObject parent) where T : class
{
var count = VisualTreeHelper.GetChildrenCount(parent);
if (count > 0)
{
for (var i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
var t = child as T;
if (t != null)
yield return t;
var children = FindChildren<T>(child);
foreach (var item in children)
yield return item;
}
}
}
}
}
使用方法很简单。比如(还是拿对话框来举例):
IDialogHost host = this.FindAncestor<IDialogHost>();
if (host != null)
{
host.ShowModalDialog(this);
}
if (host != null)
{
host.ShowModalDialog(this);
}
over.
- [Silverlight] 写了两个方便 DOM 查找的扩展方法
- DOM扩展的两个常用方法
- [Silverlight] 关于线程调用的扩展方法
- [Silverlight] 关于线程调用的扩展方法
- 扩展文件大小的两个方法
- 用MASM32写了一个查找替换的字串函数!ANSI及UNICODE两个版本
- 写扩展controlBean的方法
- Prototype DOM扩展___$()方法的改变
- javascript查找DOM元素的方法总结
- 不熟的命令 或 方法等 方便今后查找
- 写了个NSObject的扩展类
- 【元素的查找】js和jquery方法查找dom元素
- 写了两个简单的排序函数
- Java写了两个奇怪的线程
- jquery扩展的两个方法与区别
- 文件中查找字符串(自己写的两种方法,便于以后直接用了)
- 时间戳转字符串,单独写了一个类方法。转换方便。
- DOM方法总结及DOM库扩展
- Silverlight 2 beta 2 中目前不支持共享 WCF 的客户端类型
- [Silverlight] 如何在 Worker thread 中更新 UI
- Linq to sql 中如何进行 left join
- Silverlight 2 beta 2 bug 解决办法 (持续更新中)
- Silverlight + WCF 常见错误调试方法
- [Silverlight] 写了两个方便 DOM 查找的扩展方法
- Scott Guthrie 写的 Silverlight 教程索引
- Silverlight 文章收集
- [Silverlight] 一个易犯的错误:关于调用 WCF 服务
- [Silverlight] 改进 Nikhil Kothari 的换肤方案:允许自定义控件的皮肤定义
- Silverlight 的文本框自动完成(AutoComplete)
- Silverlight 下换肤的实现
- Silverlight 下苹果(Mac OS)风格按钮的实现
- Silverlight 之模态对话框的通用模拟