潜移默化学会WPF(转载篇<一>)WPF 遍历DataTemplate(获取所有控件)

情况1:在设定DataTemplate的Name,并且他是在前台表示时,获取DataTemplate里的指定控件。 方法: http://blog.csdn.net/wackelbh/article/details/6003947(参考这篇文章) 情况2:当没有设定DataTemplate的Name或是以Resource方式调用时,获取DataTemplate里的指定控件。 方法: 1、这里需要有一个从DataTemplate里获取控

  

情况1:在设定DataTemplate的Name,并且他是在前台表示时,获取DataTemplate里的指定控件。

  方法:

  http://blog.csdn.net/wackelbh/article/details/6003947(参考这篇文章)

  情况2:当没有设定DataTemplate的Name或是以Resource方式调用时,获取DataTemplate里的指定控件。

  方法:

  1、这里需要有一个从DataTemplate里获取控件的函数

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、稍微改动一下前篇里的代码:

<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>   

或者

<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内容。 private void Button_Click( object sender,System.Windows.RoutedEventArgse) { TextBlocktxt=FindFirstVisualChildTextBox(itemsContro

我需要获取DataTemplate里名为"txtName"的TextBlock控件并显示他的Text内容。

  1. private void Button_Click(object sender, System.Windows.RoutedEventArgs e)  
  2. {  
  3.     TextBlock txt = FindFirstVisualChild<TextBox>(itemsControl, "txtName");  
  4.     if (txt != null)//判断是否找到   
  5.         MessageBox.Show(txt.Text.ToString());  
  6. }  

  情况3:当没有设定DataTemplate的里的控件Name或者你压根不知道里面有哪些控件,但是你又想获取他们的值时。例如上一篇,当我动态生成CheckBox后,我想知道哪些CheckBox被选中了。

  方法:

  1、也需要一个获取DataTemplate控件的函数,但是返回的是一个集合。

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中代码(详细请看前一篇)

<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、解下来就写按钮的处理函数:

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() + "被选中了!");  
   }              
}  

 

先写到这了,以后有发现更好的方法再补上。

  本文来自wushang923的博客,原文地址:http://blog.csdn.net/wushang923/article/details/6742378

 

 

原文地址:https://www.cnblogs.com/AaronYang/p/2439413.html