WPF 遍历DataTemplate(获取所有控件)
2011-09-02 13:29
1636 查看
WPF 遍历DataTemplate(获取所有控件)
分类:WPF 2011-09-02 13:29
508人阅读 评论(5)
收藏
举报
情况1:在设定DataTemplate的Name,并且他是在前台表示时,获取DataTemplate里的指定控件。
方法:
http://blog.csdn.net/wackelbh/article/details/6003947(参考这篇文章)
情况2:当没有设定DataTemplate的Name或是以Resource方式调用时,获取DataTemplate里的指定控件。
方法:
1、这里需要有一个从DataTemplate里获取控件的函数
[csharp]
view plaincopy
public T FindFirstVisualChild<T>(DependencyObject obj, string childName) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is T && child.GetValue(NameProperty).ToString() == childName)
{
return (T)child;
}
else
{
T childOfChild = FindFirstVisualChild<T>(child, childName);
if (childOfChild != null)
{
return childOfChild;
}
}
}
return null;
}
2、稍微改动一下前篇里的代码:
[html]
view plaincopy
<ItemsControl x:Name="itemsControl" Background="#B28BB2F1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Padding="3">
<WrapPanel>
<TextBox x:Name="txtID"/>
<TextBlock x:Name="txtName" Text="Good"/>
</WrapPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
或者
[html]
view plaincopy
<Page.Resource>
<DataTemplate x:Key="data">
<Border Padding="3">
<WrapPanel>
<TextBox x:Name="txtID"/>
<TextBlock x:Name="txtName" Text="Good"/>
</WrapPanel>
</Border>
</DataTemplate>
</Page.Resources>
<ItemsControl x:Name="itemsControl" Background="#B28BB2F1" ItemTemplate="{StaticResource data}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
3、解下来就写按钮的处理函数:
我需要获取DataTemplate里名为"txtName"的TextBlock控件并显示他的Text内容。
[csharp]
view plaincopy
private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
TextBlock txt = FindFirstVisualChild<TextBox>(itemsControl, "txtName");
if (txt != null)//判断是否找到
MessageBox.Show(txt.Text.ToString());
}
情况3:当没有设定DataTemplate的里的控件Name或者你压根不知道里面有哪些控件,但是你又想获取他们的值时。例如上一篇,当我动态生成CheckBox后,我想知道哪些CheckBox被选中了。
方法:
1、也需要一个获取DataTemplate控件的函数,但是返回的是一个集合。
[csharp]
view plaincopy
public List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject child = null;
List<T> childList = new List<T>();
for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
{
child = VisualTreeHelper.GetChild(obj, i);
if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
{
childList.Add((T)child);
}
childList.AddRange(GetChildObjects<T>(child, ""));//指定集合的元素添加到List队尾
}
return childList;
}
2、xaml中代码(详细请看前一篇)
[html]
view plaincopy
<ItemsControl x:Name="itemsControl" Background="#B28BB2F1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Padding="3">
<WrapPanel>
<CheckBox Content="{Binding txt}"/>
</WrapPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
3、解下来就写按钮的处理函数:
[csharp]
view plaincopy
private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
DataVisualTreeHelper VTHelper = new DataVisualTreeHelper();
List<CheckBox> collection = VTHelper.GetChildObjects<CheckBox>(itemsControl, "")//第2个参数为空,表示查找所有指定类型的控件(返回
一个CheckBox集合)
foreach (CheckBox item in collection //遍历这个集合
{
if (item.IsChecked == true)
MessageBox.Show(item.Content.ToString() + "被选中了!");
}
}
相关文章推荐
- WPF 遍历DataTemplate(获取所有控件)
- 潜移默化学会WPF(转载篇<一>)--WPF 遍历DataTemplate(获取所有控件)
- WPF 遍历DataTemplate(获取所有控件)
- WP ListBox 遍历DataTemplate(获取所有控件)
- WPF silverlight获取子控件(获取DataTemplate里的子控件)
- WPF 获取 ListView DataTemplate 中控件值
- WPF 点击 datatemplate 里面的控件,获取相应绑定的数据
- Windows Phone 如何获取ListBox的ItemTemplate/DataTemplate 中指定的控件
- Silverlight实用窍门系列:66.Silverlight的数据模板DataTemplate(二)获取数据模板控件
- WPF 获取ControlTemplate 中的控件方法
- WPF-控件-DataTemplate生成的控件
- WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探
- 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素
- WPF 深入浅出 模板(DataTemplate 数据外衣、ControlTemplate 控件外衣、ItemsPanelTemplate 项布局
- 获取WPF所有控件的模板内容
- 获取GridView的EmptyDataTemplate中的控件
- CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本
- [Silverlight学习笔记]如何获取ItemsControl的DataTemplate中定义的控件?
- WPF中的模板(四)- 寻找ControlTemplate和DataTemplate的控件
- WPF 获得DataTemplate中的控件