How to get a top object (Window or Page) in WPF? [

2019-02-03 02:13发布

问题:

This question already has an answer here:

  • WPF User Control Parent 14 answers

Within my custom WPF control I want to get a containing Window or Page. Window.GetWindow() method works fine when control is in a windowed app but when it's in the XBAP app in a browser it returns browser window instead of the page.

Is there any other way to do this?

回答1:

This works for me:

Window parentWindow = Window.GetWindow(this);


回答2:

var parent = VisualTreeHelper.GetParent(this);
while (!(parent is Page))
{
    parent = VisualTreeHelper.GetParent(parent);
}
(parent as Page).DoStuff();


回答3:

You can use the VisualTreeHelper class to retrieve the top-level control :

DependencyObject GetTopLevelControl(DependencyObject control)
{
    DependencyObject tmp = control;
    DependencyObject parent = null;
    while((tmp = VisualTreeHelper.GetParent(tmp)) != null)
    {
        parent = tmp;
    }
    return parent;
}


回答4:

i think best way is

var obj = VisualTreeHelper.GetParent((DependencyObject)Content);