在我的自定義WPF控件中,我想獲取一個包含Window或Page的對象。 Window.GetWindow()方法在控件位於窗口應用程序中時正常工作,但當它位於瀏覽器中的XBAP應用程序中時,它將返回瀏覽器窗口而不是頁面。如何獲取WPF中的頂級對象(Window或Page)?
有沒有其他方法可以做到這一點?
在我的自定義WPF控件中,我想獲取一個包含Window或Page的對象。 Window.GetWindow()方法在控件位於窗口應用程序中時正常工作,但當它位於瀏覽器中的XBAP應用程序中時,它將返回瀏覽器窗口而不是頁面。如何獲取WPF中的頂級對象(Window或Page)?
有沒有其他方法可以做到這一點?
可以使用VisualTreeHelper類檢索頂層控制:
DependencyObject GetTopLevelControl(DependencyObject control)
{
DependencyObject tmp = control;
DependencyObject parent = null;
while((tmp = VisualTreeHelper.GetParent(tmp)) != null)
{
parent = tmp;
}
return parent;
}
var parent = VisualTreeHelper.GetParent(this);
while (!(parent is Page))
{
parent = VisualTreeHelper.GetParent(parent);
}
(parent as Page).DoStuff();
您好托米斯拉夫馬爾科夫斯基,你的解決方案是非常有用的找到最上面的父母,即頁。但是DoStuff()方法不能被調用。我得到的錯誤說'Windows.UI.Xaml.Controls.Page'沒有包含'DoStuff'的定義(你是否缺少使用指令或參考?) 我迫切需要從MainPage中調用一個方法動態的用戶控制,無法做到這一點。請幫助。 – 2013-03-12 17:18:15
更改'while(!(parent是Page))'和'(parent爲Page).DoStuff();'測試並轉換爲您的頁面類。如果這是MainPage,那麼'parent是MainPage'等。顯然'DoStuff()'應該是你的函數的名字。 – 2013-03-13 19:05:17
我認爲最好的辦法是
var obj = VisualTreeHelper.GetParent((DependencyObject)Content);
這隻會給你直接的父母。考慮在一個窗口中是否有多個嵌套用戶控件。 – ezolotko 2013-08-27 06:38:20
這個工作對我來說:
Window parentWindow = Window.GetWindow(this);
非常感謝。缺少Page.GetPage方法...:S – 2015-02-23 12:48:58
嗯...我想我已經發表了這個評論...這不當你的控件在模板中工作。當您到達模板「root」時,循環結束。 – 2009-05-16 07:20:55