Лучший способ стать родителем UserControl в Silverlight - PullRequest
2 голосов
/ 27 января 2011

На моем MainPage.xaml мне иногда нужно добавить UserControl на главную панель (холст). При щелчке этому UserControl необходим доступ к подпрограмме из MainPage.xaml - его родителя - который либо сам сделает UserControl Visibility = Collapsed, либо удалит все вместе из MainPage.xaml.

Прямо сейчас в коде этого UserControl я делаю

Dim c = VisualTreeHelper.GetParent(Me)
Dim mp As MainPage = VisualTreeHelper.GetParent(c)
mp.MyRoutine(3)

Это работает, но заставляет задуматься, есть ли более прямой способ сделать это или более предпочтительный способ. Есть идеи?

Ответы [ 3 ]

5 голосов
/ 27 января 2011

Более общий способ навигации по визуальному дереву доступен через Linq To VisualTree , с этим небольшим каркасом вы можете выполнять все виды запросов к вашему визуальному дереву.Ваш пример получения родителя будет прост:

var parent = me.Ancestors().First();

Или, если вы хотите найти первого родителя данного типа ...

var parent = me.Ancestors<MainPage>().Cast<MainPage>().First()
4 голосов
/ 27 января 2011

В общем, я бы избегал этого типа зависимости.Это значительно снижает полезность и гибкость вашего UserControl.

Вместо этого, возможно, было бы лучше вставить зависимость в UserControl во время построения (или даже во время выполнения).Вы можете передать делегат, ссылающийся на MyRoutine, или интерфейс, который реализует главная страница.

Таким образом, зависимость UserControl будет очевидна (так как это часть API), и ее можно будет использоватьэто с другими приложениями / страницами позже.

При этом, если вы решите сохранить вышеизложенное, я бы внес как минимум одно изменение.Вместо того, чтобы ожидать, что родительский родитель всегда будет «MainWindow», я бы рекурсивно проверял родителей, пока вы не дойдете до MainWindow (или ничего) в методе вашего класса.Это, как минимум, позволит вам гибко перемещать свой UserControl по иерархии, не нарушая его.

2 голосов
/ 27 января 2011

Общий способ навигации по визуальному дереву - мой собственный код VisualTreeEnumeration . Однако, как я заявляю в блоге, есть и другие утилиты, которые делают то же самое. Что бы вы ни использовали, вы в конечном итоге получаете множество предков. Однако наиболее гибким подходом будет охота на тип MainPage: -

(Примечание C #)

MainPage mp = this.Ancestors().OfType<MainPage>().FirstOrDefault();

Не уверен, что это будет выглядеть как VB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...