其内容来源可以是几个方面:
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.
最新评论