在Silverlight项目开发中,经常会把一个独立功能的控件封装成一个UserControl,然后供其他页面或者控件进行调用。前一段时间,在项目中遇到一个问题,需要在同一个页面重复调用多个相同的UserControl控件,然后在父页面中控制这些重复生成的子控件。由于很多控件是动态
在Silverlight项目开发中,经常会把一个独立功能的控件封装成一个UserControl,然后供其他页面或者控件进行调用。前一段时间,在项目中遇到一个问题,需要在同一个页面重复调用多个相同的UserControl控件,然后在父页面中控制这些重复生成的子控件。由于很多控件是动态生成,数量也是动态控制,所以所有的操作都需要使用后台代码进行实现。
在上面的需求中需要用到Silverlight API中的VisualTreeHelper类,对于VisualTreeHelper类,有不少文章已经介绍过,该类可以对Silverlight可视化树进行遍历,该可视化树是逻辑对象树的一个子集。我们可以通过VisualTreeHelper提供的方法GetChild(),GetParent()和GetChildrenCount(),分别获取子控件,父控件以及子控件数量。
在实际项目中,为满足实际开发需求,对VisualTreeHelper的方法重新进行封装是非常必要的。
首先要介绍的Hleper方法是GetParentObject方法,获取父控件方法。该方法将根据当前控件,遍历查找其父控件是否存在。参数1是表示当前子控件名,参数2是要查询父控件名;使用VisualTreeHelper.GetParent方法获取当前父控件。
2 {
3 DependencyObject parent = VisualTreeHelper.GetParent(obj);
4
5 while (parent != null )
6 7 if is T && (((T)parent).Name == name | .IsNullOrEmpty(name)))
8 9 return (T)parent;
10 }
11 12 parent VisualTreeHelper.GetParent(parent);
13 14 15 ;
16 17
最后介绍一个Helper方法是GetChildobjects方法,该方法将把所有子控件作为List集合返回到客户端。其中第一个参数是父控件参数,而第二个参数是特定子控件名称,如果需要遍历全部子控件,第二个参数留空即可。
使用方法很简单,首先创建基础控件:
partial class MainPage : UserControl
MainPage()
InitializeComponent();
private void btDemoButton_Click( object sender,RoutedEventArgs e)
Globals VTHelper Globals();
StackPanel sp VTHelper.GetChildobject ( this .LayoutRoot,0)">" spDemoPanel " );
Grid layoutGrid VTHelper.GetParentObject .spDemoPanel,0)">LayoutRoot textblock VTHelper.GetChildobjects (sp (layoutGrid (textblock.Count tbResult.Text 包含TextBlock控件数量为: + textblock.Count.ToString() \n += 获取父控件成功....\n ;
29 30 获取子控件成功....\n 31 32 33 34 btModifyChild_Click( 35 36 37 38 sp.Background SolidColorBrush(Colors.Purple);
39 40 41 btModifyChilds_Click( 42 43 44 45 foreach (TextBlock tmpTextblock in textblock)
46 47 tmpTextblock.FontSize 48 49 50 51 }
在线演示:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。