2009-09-24 21 views
9

, więc mam to UserControl, który jest wewnątrz innego UserControl. Nazwijmy je ParentUC i ChildUC. Muszę uzyskać ParentUC z ChildUC.WPF Uzyskaj UserControl właściciela

Wiem, aby właściciel okna był Window.GetWindow(userControl), ale UserControl nie ma takiej metody jak AFAIK.

Dzięki za pomoc!

Odpowiedz

14

Wpadłem na to rozwiązanie, ale post, jeśli masz lepszy. Dzięki!

DependencyObject ucParent = this.Parent; 

while (!(ucParent is UserControl)) 
{ 
    ucParent = LogicalTreeHelper.GetParent(ucParent); 
} 
0

Zawsze można użyć VisualTreeHelper.GetParent(child), aby zwrócić obiekt nadrzędny w drzewie wizualnym (formant użytkownika nadrzędnego z zagnieżdżonego formantu użytkownika).

+0

Zrobiłem to, ale dostaje siatkę, która zawiera kontrolkę, to jest powód, dla którego musiałem pętli, dopóki nie otrzyma pierwszego UserControl w drzewie logicznym. I myślę, że lepiej jest użyć LogicalTreeHelper, aby pętla nie dostała się do szablonów, adoratorów itp. Dzięki za sugestię. – Carlo

0

UserControl ma właściwość .Parent, która powinna dać ci dostęp do jej rodzica.

Następnie można rzucić go do obiektu ParentUC.

+0

Tak, problem polega na tym, że UserControl może znajdować się wewnątrz StackPanel, czyli wewnątrz Grid, czyli wewnątrz nadrzędnego UserControl, w którym to przypadku myUserControl.Parent będzie StackPanel, myUserControl.Parent.Parent będzie Siatka, a na końcu myUserControl.Parent.Parent.Parent (oczywiście, że jest to uproszczone przez odrzucanie rodzica do StackPanel lub Grid) będzie UserControl. Właśnie dlatego używam pętli, aby uzyskać pierwszą kontrolę UserControl nad dzieckiem. – Carlo

+0

Haha, widziałem rozwiązanie, które opublikowałeś (nie zdając sobie sprawy, że również zadałeś to pytanie) i od czasu pojawienia się pytania (do mnie), aby wskazać, że ChildUC jest bezpośrednim dzieckiem ParentUC, chciałem zapewnić prostsze odpowiedź. Biorąc pod uwagę dodatkowe informacje do twojego scenariusza, myślę, że rozwiązaniem, które wymyśliłeś, jest to, co musisz zrobić. – Scott

+0

Tak wydaje się. Gdzieś czytałem, co robi Window.GetWindow (UIElement), więc domyślam się, że to najlepszy zakład. Dzięki za sugestię! – Carlo

Powiązane problemy