您的位置:首页 > Web前端 > HTML

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() + "被选中了!");  
   }              
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  datatemplate wpf html null list