Не удается найти родителя шаблонного элемента управления по типу (!) (wpf)

В моем проекте WPF у меня немного сложное управление. В проекте я использую только элементы управления (они все шаблонные), кроме MainWindow.

На одном экране у меня есть следующий макет (для отображения макета после применения шаблонов и заполнения содержимого):

MyScreenControl
-MyTableControl
--ItemsControl
--- HeaderItemsControl
-----HeaderItemsControl.Header
------MyHeaderControl
- ----HeaderItemsControl.Items
------MyItemControl
------MyItemControl
------MyItemControl
...

Когда я нахожусь в файле кода ScreenControl, в методе OnMouseLeftButtonDown я хотел бы определить, произошло ли событие щелчка из MyHeaderControl или MyItemControl.

Источник MouseButtonEventArgs — это ScreenControl, а OriginalSource — это TextBlock в шаблоне MyItemControl/MyHeaderControl.

Моя первая попытка найти MyItemControl/MyHeaderControl состояла в том, чтобы начать с OriginalSource и рекурсивно просмотреть тип свойства Parent. Он отлично работает, пока я не доберусь до корня шаблона (в данном случае это ViewBox), но в корне нет родительского элемента.

Я использовал подобный метод в моем более раннем проекте az, и он работал, но тогда я работал с пользовательскими элементами управления, а не с элементами управления или шаблонами.

Любые идеи, как мне подойти к этой проблеме (хорошая идея так же хороша, как и код)?

спасибо, Теншико


person Tenshiko    schedule 02.12.2010    source источник
comment
Иногда полезно искать родителя, пока не загружен дочерний. Например, вы можете использовать событие yourChild.Loaded.   -  person peter70    schedule 11.05.2017


Ответы (2)


Вы пытались просто получить templatedParent originalSource? :

Control originalSource = e.OriginalSource;

MyItemControl myItemControl = originalSource.TemplatedParent as MyItemControl;
MyHeaderControl myHeaderControl = originalSource.TemplatedParent as MyHeaderControl;

if (MyItemControl != null) ....
else if (MyHeaderControl != null) ....

(см.: http://msdn.microsoft.com/en-gb/library/system.windows.frameworkelement.templatedparent.aspx)

person David    schedule 02.12.2010

Ознакомьтесь с VisualTreeHelper.GetParent, который позволит вам пройтись по визуальному дереву, где элементы управления фактически были созданы в шаблоне.

person Dan Bryant    schedule 02.12.2010
comment
Он делает то же самое. Согласно GetParent() мой элемент управления выглядит так: - person Tenshiko; 02.12.2010
comment
grid-grid-textblock вместо control-grid-grid-textblock - person Tenshiko; 02.12.2010