Визуальное дерево - найдите метку (в любом месте окна), где содержимое равно - PullRequest
0 голосов
/ 09 января 2012

У меня много меток как дочерних элементов многих различных панелей стека, которые все являются дочерними элементами списка, и мне нужно сослаться на одну из этих меток, которые были Content.toString () == "критерий".Другими словами, обход визуального дерева в WPF будет болезненным, потому что есть много родительских / дочерних методов для запуска.Есть ли способ найти один из этих ярлыков в моем окне, если у него нет имени и предполагается, что я не знаю, как далеко «вниз» он находится в дереве?Может быть, в окне есть коллекция предметов (без иерархии), с которой я могу запустить LINQ против ??

Если вам интересно, почему у меня нет названия для ярлыков - это потому, что онисгенерированный шаблоном данных.

Большое спасибо,

Дан

Ответы [ 4 ]

2 голосов
/ 09 января 2012
1 голос
/ 09 января 2012

Я сделал небольшое изменение в коде, который @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...
}
1 голос
/ 09 января 2012

я думаю, что этот код может быть полезен для вас:

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

я использовал Этот вопрос в качестве моей базы

1 голос
/ 09 января 2012

Я не знаю, поможет ли это или нет:

Если вы ищете конкретную метку на каждой панели стека в listBox, то вы можете просто найти эту конкретную метку с ее конкретным именем и сравнить содержимое.

...