在我的WPF项目中,我有一点复杂的控制。在项目中我只使用控件(它们都是模板化的),除了MainWindow。
在一个屏幕上,我有以下布局(用于在应用模板和填充内容后显示布局):
MyScreenControl
-MyTableControl
--ItemsControl
--- HeaderItemsControl
----- HeaderItemsControl.Header
------ MyHeaderControl
----- HeaderItemsControl.Items
------ MyItemControl
------ MyItemControl
------ MyItemControl
...
当我在ScreenControl的代码文件中时,在OnMouseLeftButtonDown方法中,我想确定click事件是来自MyHeaderControl还是来自MyItemControl。
MouseButtonEventArgs的Source是ScreenControl,而OriginalSource是MyItemControl / MyHeaderControl模板中的TextBlock。
我第一次尝试找到MyItemControl / MyHeaderControl是从OriginalSource开始,并递归地查看Parent属性的类型。它工作正常,直到我到达模板的根(在这种情况下是一个ViewBox),但根没有父元素。
我在我之前的z早期项目中使用了这样的方法并且它有效,但后来我使用的是UserControls,而不是控件,也没有使用模板。
任何想法我应该如何处理这个问题(一个好主意和代码一样好)?
THX, Tenshiko
答案 0 :(得分:5)
您是否尝试过简单地获取originalSource的templatedParent? :
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)
答案 1 :(得分:2)
查看VisualTreeHelper.GetParent,它可以让你走过实际通过模板实例化控件的可视化树。