可视化树-查找内容相等的标签(窗口上的任何位置)

本文关键字:标签 窗口 任何 位置 查找 可视化 | 更新日期: 2023-09-27 18:19:46

我有许多标签作为许多不同堆栈面板的子级,这些面板都是列表框的子级。我需要引用其中一个标签Content.toString()=="criteria"。换句话说,在WPF中遍历可视化树将是一个巨大的痛苦,因为有许多父/子方法要运行。有没有一种方法可以在我的窗户上找到一个没有名字的标签,并假设我不知道它在树上有多远?也许有一个窗口中所有东西的项目集合(没有继承权),我可以对其运行LINQ??

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

非常感谢

Dan

可视化树-查找内容相等的标签(窗口上的任何位置)

看起来就像您正在寻找的:查找数据模板生成的元素

我对@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...
}

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

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

我用这个问题作为我的基础

我不知道这是否有帮助:

如果您正在listBox中的每个堆栈面板中查找特定标签,那么您可以只查找具有特定名称的特定标签并比较内容。