Не удается найти родителя шаблонного элемента управления по типу (!) (Wpf)
В моем проекте WPF у меня немного сложное управление. В проекте я использую только элементы управления (они все шаблонные), кроме MainWindow.
На одном экране у меня есть следующий макет (для отображения макета после применения шаблонов и заполнения содержимого):
MyScreenControl
-MyTableControl
--ItemsControl
--- HeaderItemsControl
----- HeaderItemsControl.Header
------ MyHeaderControl
----- HeaderItemsControl.Items
------ MyItemControl
------ MyItemControl
------ MyItemControl
...
Когда я нахожусь в файле кода ScreenControl, в методе OnMouseLeftButtonDown я хотел бы определить, произошло ли событие click из MyHeaderControl или MyItemControl.
Источник MouseButtonEventArgs - это ScreenControl, а SourceSource - это TextBlock в шаблоне MyItemControl/MyHeaderControl.
Моя первая попытка найти MyItemControl/MyHeaderControl состояла в том, чтобы начать с OriginalSource и рекурсивно посмотреть на тип свойства Parent. Он работает нормально, пока я не доберусь до корня шаблона (в данном случае это ViewBox), но у корня нет родительского элемента.
Я использовал такой метод в моем более раннем проекте, и он работал, но потом я работал с пользовательскими элементами управления, а не с элементами управления или шаблонами.
Любые идеи, как я должен подойти к этой проблеме (хорошая идея, а также код)?
спасибо, Теншико
2 ответа
Вы пытались просто получить исходный шаблонный шаблонный родитель?:
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)
Посмотрите VisualTreeHelper.GetParent, который позволит вам пройтись по визуальному дереву, где элементы управления фактически были созданы с помощью шаблона.