如何在WPF中获得顶级对象(窗口或页面)?

Ala*_*ich 30 wpf wpf-controls

在我的自定义WPF控件中,我想获得一个包含Window或Page.当控件在窗口化的应用程序中时,Window.GetWindow()方法工作正常但是当它在浏览器中的XBAP应用程序中时,它返回浏览器窗口而不是页面.

有没有其他方法可以做到这一点?

Com*_*33k 65

这对我有用:

Window parentWindow = Window.GetWindow(this);
Run Code Online (Sandbox Code Playgroud)


Tom*_*ski 29

var parent = VisualTreeHelper.GetParent(this);
while (!(parent is Page))
{
    parent = VisualTreeHelper.GetParent(parent);
}
(parent as Page).DoStuff();
Run Code Online (Sandbox Code Playgroud)

  • 改变`while(!(parent is Page))`和`(parent as Page).DoStuff();`来测试并转换为你的页面类.如果那是MainPage,那么`parent是MainPage`等.显然`DoStuff()`应该是你的函数的名字. (3认同)

Tho*_*que 6

您可以使用VisualTreeHelper类来检索顶级控件:

DependencyObject GetTopLevelControl(DependencyObject control)
{
    DependencyObject tmp = control;
    DependencyObject parent = null;
    while((tmp = VisualTreeHelper.GetParent(tmp)) != null)
    {
        parent = tmp;
    }
    return parent;
}
Run Code Online (Sandbox Code Playgroud)

  • 嗯......我想我已经发布了这个评论...当你的控件在模板中时,这不起作用.当您到达模板"root"时,循环结束. (2认同)