Marc Clifton Ответов: 1

Вопрос Wpf о программном перемещении вверх по дереву управления


Должен быть способ получше этого:

var tabItem = (TabItem)((ContentControl)((UserControl)((Grid)((TextBox)sender).Parent).Parent).Parent).Parent;

Идея здесь заключается в том, что мне нужно получить TabItem, в котором находится текстовое поле, которое находится в сетке, которое находится в пользовательском элементе управления, который находится в ContentControl TabItem.

Что я уже пробовал:

Как говорится в "проблеме" (но здесь мне нужно 30 символов), это:

var tabItem = (TabItem)((ContentControl)((UserControl)((Grid)((TextBox)sender).Parent).Parent).Parent).Parent;

является грубым и зависит от структуры дерева управления.

Marco Bertschi

"Мне нужно 30 символов здесь"
Сам никогда этого не делал.

1 Ответов

Рейтинг:
0

Graeme_Grant

System.Windows.Media пространство имен имеет VisualTreeHelper класс, который можно использовать для обхода дерева зависимостей с помощью GetChild и GetParent методы.

Таким образом, вы могли бы сделать что-то вроде этого (непроверенного):

private FrameworkElement GetParent(FrameworkElement item, Type targetType)
{
    var parent = VisualTreeHelper.GetParent(item);
    while (parent.GetType() != targetType)
    {
        parent = VisualTreeHelper.GetParent(parent);
    }
    return parent;
}
Тогда использовать было бы (непроверено):
var tabItem = GetParent(sender as FrameworkElement, TabItem);