2012-01-09 18 views
0

找到一个标签(在窗口的任何地方)我有很多标签作为许多不同的堆栈面板的孩子,这是所有的列表框的孩子,我需要引用这些标签之一是内容.toString()==“条件”。换句话说,遍历WPF中的可视化树将是一个球疼,因为有许多父/子方法可以运行。有没有一种方法可以在我的窗口上找到这些标签中的一个,而不需要它的名称,并假设我不知道它在树中有多远?也许有一个窗口中的所有东西的项目集合(没有heirarchy),我可以运行一些LINQ对?可视化树 - 在内容等于

如果您想知道为什么我没有标签名称 - 这是因为它们是由数据模板生成的。

非常感谢,

+2

是否担心遍历视觉树将导致性能问题? – 2012-01-09 15:03:34

+0

不一定,我只需要在应用程序启动时执行一次此操作。更多的是关心我的代码在我多次上下树之后不会变得多么优雅。 – 2012-01-09 15:06:08

回答

1

我做了细微的变化到@anatoliiG链接的代码以返回指定类型的所有子控件(而不是第一个):

private IEnumerable<childItem> FindVisualChildren<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) 
      yield return (childItem)child; 

     foreach (var childOfChild in FindVisualChildren<childItem>(child)) 
      yield return childOfChild; 
    } 
} 

有了这个功能,你可以做这样的事情:

var criteriaLabels = 
    from cl in FindVisualChildren<Label>(myListBox) 
    where cl.Content.ToString() == "criteria" 
    select cl; 

foreach (var criteriaLabel in criteriaLabels) 
{ 
    // do stuff... 
} 
+0

完美。非常感谢! – 2012-01-09 15:33:39

1

我不知道这是否有帮助与否:

如果您正在寻找在ListBox中的每个堆栈面板中的特定标签,然后你可以只用特定的名字寻找特定的标签并比较内容。

+0

我没有任何标签的名称。可以肯定的是,我对栈面板也没有名字。这些都是由数据模板生成的。 – 2012-01-09 14:56:46

2

好像你正在寻找什么:Find DataTemplate-Generated Elements

+0

它确实很近。你知道是否有动态命名数据模板中的对象吗?我似乎无法绑定到Name属性。非常感谢。 – 2012-01-09 15:18:52

+0

@DanielMcNulty,你的意思是在页面范围内的每个对象的唯一名称(不只是在模板内)? – 2012-01-09 15:23:42

+1

另请参见['VisualTreeHelper'](http://msdn.microsoft.com/zh-cn/library/system.windows.media.visualtreehelper.aspx)。您可以使用Linq查询先祖或后代。 – 2012-01-09 15:28:44

1

我认为这个代码可能对您有用:

 foreach (Control control in this.Controls) 
     { 
      if (control.GetType() == typeof(Label)) 
       if (control.Text == "yourText") 
       { 
        // do your stuff 
       } 
     } 

我用This question作为我的基地

+0

啊。看起来很有希望,我现在就去... – 2012-01-09 15:19:09

+0

控制的财产似乎并不存在!?即this.Controls是无效的。 – 2012-01-09 15:22:15

+0

嗯很奇怪,虽然即时通讯使用winforms,WPF应该有一个集合的添加控件也 – Moonlight 2012-01-09 15:28:27