2009-05-08 29 views
20

Trong điều khiển WPF tùy chỉnh của tôi, tôi muốn có một Cửa sổ hoặc Trang chứa. Phương thức Window.GetWindow() hoạt động tốt khi điều khiển nằm trong một ứng dụng cửa sổ nhưng khi nó nằm trong ứng dụng XBAP trong một trình duyệt, nó trả về cửa sổ trình duyệt thay vì trang.Làm thế nào để có được một đối tượng trên cùng (Window hoặc Page) trong WPF?

Có cách nào khác để thực hiện việc này không?

Trả lời

6

Bạn có thể sử dụng lớp VisualTreeHelper để lấy sự kiểm soát cấp cao nhất:

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

Hmm ... Tôi nghĩ tôi đã đăng nhận xét này ... Điều này không hoạt động khi kiểm soát của bạn nằm trong một Mẫu. Vòng lặp kết thúc khi bạn đến mẫu "root". –

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

Xin chào Tomislav Markovski, giải pháp của bạn rất hữu ích cho việc tìm kiếm cha mẹ trên cùng, tức là Trang. Nhưng phương thức DoStuff() không thể được gọi. Tôi nhận được lỗi nói 'Windows.UI.Xaml.Controls.Page' không chứa định nghĩa cho 'DoStuff' (bạn có thiếu chỉ thị sử dụng hoặc tham chiếu assemply không?) Tôi rất cần gọi một phương thức trong MainPage từ điều khiển người dùng động và không thể thực hiện việc này. Xin vui lòng giúp đỡ. –

+3

Thay đổi 'while (! (Cha mẹ là Trang))' và '(cha mẹ thành Trang) .DoStuff();' để kiểm tra và truyền đến lớp trang của bạn. Nếu đó là MainPage, sau đó 'cha mẹ là MainPage' vv Rõ ràng' DoStuff() 'nên là tên của chức năng của bạn. –

0

tôi nghĩ rằng cách tốt nhất là

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

Điều này sẽ chỉ cung cấp cho bạn phụ huynh trực tiếp. Hãy xem xét nếu bạn có nhiều điều khiển người dùng lồng nhau trong một cửa sổ. – ezolotko

44

này làm việc cho tôi:

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

Rất cảm ơn. Thiếu phương thức Page.GetPage ...: S –

Các vấn đề liên quan