zoukankan      html  css  js  c++  java
  • 如何在WPF和Silverlight中取得DataTemplate中的命名元素

    WPF

    1.假如ListBox使用如下的DataTemplate

    代码
    <DataTemplate x:Key="myDataTemplate">
      
    <TextBlock Name="textBlock" FontSize="14" Foreground="Blue">
        
    <TextBlock.Text>
          
    <Binding XPath="Title"/>
        
    </TextBlock.Text>
      
    </TextBlock>
    </DataTemplate>

    2.在cs文件中写如下的代码可以找到某个ListBoxItem对应的TextBlock

    代码
    ListBoxItem myListBoxItem =
        (ListBoxItem)(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.CurrentItem));

    ContentPresenter myContentPresenter 
    = FindVisualChild<ContentPresenter>(myListBoxItem);

    DataTemplate myDataTemplate 
    = myContentPresenter.ContentTemplate;
    TextBlock myTextBlock 
    = (TextBlock)myDataTemplate.FindName("textBlock", myContentPresenter);
    MessageBox.Show(
    "The text of the TextBlock of the selected list item: "
        
    + myTextBlock.Text);

    private childItem FindVisualChild<childItem>(DependencyObject obj)
        
    where childItem : DependencyObject
    {
        
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            DependencyObject child 
    = VisualTreeHelper.GetChild(obj, i);
            
    if (child != null && child is childItem)
                
    return (childItem)child;
            
    else
            {
                childItem childOfChild 
    = FindVisualChild<childItem>(child);
                
    if (childOfChild != null)
                    
    return childOfChild;
            }
        }
        
    return null;
    }

    SilverLight

    1. Xmal 和WPF中相同

    2. 由于SL中的DataTemplate没有FindName方法,因此c#代码有所区别

    代码
    ListBoxItem myListBoxItem =
        (ListBoxItem)(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.CurrentItem));

    TextBlock myTextBlock 
    = FindFirstVisualChild<TextBlock>(_myListBoxItem , "textBlock");
    MessageBox.Show(
    "The text of the TextBlock of the selected list item: "
        
    + myTextBlock.Text);

    private childItem FindVisualChild<childItem>(DependencyObject obj,String childName)
        
    where childItem : DependencyObject
    {
        
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            DependencyObject child 
    = VisualTreeHelper.GetChild(obj, i);
            
    if (child != null && child is childItem && child.GetValue(NameProperty).ToString()==childName)
                
    return (childItem)child;
            
    else
            {
                childItem childOfChild 
    = FindVisualChild<childItem>(child,childName);
                
    if (childOfChild != null)
                    
    return childOfChild;
            }
        }
        
    return null;
    }
  • 相关阅读:
    SysRq组合键是一组"魔术组合键"
    iptables FTP脚本
    (转)SSH的端口转发
    进制转换
    指定的参数已超出有效值的范围
    静态类
    接口
    快捷键,移到最上层
    gitbook
    nginx服务无法停止(Windows)
  • 原文地址:https://www.cnblogs.com/xixifusigao/p/1656453.html
Copyright © 2011-2022 走看看