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

35

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

有其他的方法可以实现这个功能吗?

4个回答

90

这对我有效:

Window parentWindow = Window.GetWindow(this);

非常感谢。缺少 Page.GetPage 方法... :S - Ignacio Soler Garcia
非常有用!我现在可以像这样访问父窗口"MyWindow"的控件:[ MyWindow mw = parentWindow as MyWindow; ]。 - Exel Gamboa

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

嗨,Tomislav Markovski,您的解决方案非常有帮助,可以找到最顶层的父级即页面。但是无法调用DoStuff()方法。我收到错误信息,说“Windows.UI.Xaml.Controls.Page”不包含“DoStuff”的定义(您是否缺少使用指令或程序集引用?)我迫切需要从动态用户控件中调用MainPage中的方法,但无法实现。请帮忙。 - Merin Nakarmi
3
while (!(parent is Page))(parent as Page).DoStuff(); 改为测试并转换为您的页面类。如果是主页(MainPage),则使用 parent is MainPage 等。显然,DoStuff() 应该是您函数的名称。 - Tomislav Markovski

7
您可以使用VisualTreeHelper类来检索顶层控件:
DependencyObject GetTopLevelControl(DependencyObject control)
{
    DependencyObject tmp = control;
    DependencyObject parent = null;
    while((tmp = VisualTreeHelper.GetParent(tmp)) != null)
    {
        parent = tmp;
    }
    return parent;
}

3
哦...我想我已经发布了这个评论...当你的控件在模板中时,这并不起作用。当你到达模板“根”时,循环就会结束。 - Alan Mendelevich

0

我认为最好的方法是

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

2
这只会给你直接的父级。考虑一下如果在一个窗口中有多个嵌套的用户控件。 - ezolotko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接