Как я могу получить доступ к базовому родителю объекта в иерархии WPF? - PullRequest
2 голосов
/ 18 сентября 2009

Глубоко внутри моего объекта WPF hiearchy Я создаю объект Window.

Однако я хочу, чтобы владелец этого оконного объекта был базовым объектом Window .

Я пытался «залезть на дерево» с помощью следующего типа кода, но этот подход кажется неоптимальным :

(((((((TabGroupPane)((ContentPane) this.Parent).Parent).Parent as
SplitPane).Parent as DocumentContentHost).Parent as 
XamDockManager).Parent as ContentControl).Parent as 
StackPanel).Parent...

Как получить доступ к базовому объекту Window?

Я думаю о чем-то вроде этого:

псевдокод:

Window baseWindow = this.BaseParent as Window;

Ответы [ 2 ]

2 голосов
/ 18 сентября 2009

Подход, который работает для всех типов, состоит в том, чтобы пройтись по логическому дереву, пока не найдете требуемый узел типа:

Window baseWindow = FindLogicalParent<Window>(this);

Этот метод не существует в фреймворке, поэтому вот реализация:

internal static T FindLogicalParent<T>(DependencyObject obj)
   where T : DependencyObject
{
    DependencyObject parent = obj;
    while (parent != null)
    {
        T correctlyTyped = parent as T;
        if (correctlyTyped != null)
            return correctlyTyped;
        parent = LogicalTreeHelper.GetParent(parent);
    }

    return null;
}

Для Window, в частности, вы можете использовать:

Window.GetWindow(this);
0 голосов
/ 18 сентября 2009

Позвольте мне ответить на этот вопрос:

Window baseWindow = Application.Current.Windows[0];
...