首页 > Windows开发 > 详细

潜移默化学会WPF(转载篇<一>)--WPF 遍历DataTemplate(获取所有控件) - AYUI框架 - 博客园

时间:2019-03-01 23:53:48      阅读:287      评论:0      收藏:0      [点我收藏+]
原文:潜移默化学会WPF(转载篇<一>)--WPF 遍历DataTemplate(获取所有控件) - AYUI框架 - 博客园

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

 

 

潜移默化学会WPF(转载篇<一>)--WPF 遍历DataTemplate(获取所有控件) - AYUI框架 - 博客园

原文:https://www.cnblogs.com/lonelyxmas/p/10459139.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!