2009-05-08 19 views
20

在我的自定義WPF控件中,我想獲取一個包含Window或Page的對象。 Window.GetWindow()方法在控件位於窗口應用程序中時正常工作,但當它位於瀏覽器中的XBAP應用程序中時,它將返回瀏覽器窗口而不是頁面。如何獲取WPF中的頂級對象(Window或Page)?

有沒有其他方法可以做到這一點?

回答

6

可以使用VisualTreeHelper類檢索頂層控制:

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

嗯...我想我已經發表了這個評論...這不當你的控件在模板中工作。當您到達模板「root」時,循環結束。 – 2009-05-16 07:20:55

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

您好托米斯拉夫馬爾科夫斯基,你的解決方案是非常有用的找到最上面的父母,即頁。但是DoStuff()方法不能被調用。我得到的錯誤說'Windows.UI.Xaml.Controls.Page'沒有包含'DoStuff'的定義(你是否缺少使用指令或參考?) 我迫切需要從MainPage中調用一個方法動態的用戶控制,無法做到這一點。請幫助。 – 2013-03-12 17:18:15

+3

更改'while(!(parent是Page))'和'(parent爲Page).DoStuff();'測試並轉換爲您的頁面類。如果這是MainPage,那麼'parent是MainPage'等。顯然'DoStuff()'應該是你的函數的名字。 – 2013-03-13 19:05:17

0

我認爲最好的辦法是

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

這隻會給你直接的父母。考慮在一個窗口中是否有多個嵌套用戶控件。 – ezolotko 2013-08-27 06:38:20

44

這個工作對我來說:

Window parentWindow = Window.GetWindow(this); 
+0

非常感謝。缺少Page.GetPage方法...:S – 2015-02-23 12:48:58