无法通过类型(!)找到模板化控件的父级(wpf)

时间:2010-12-02 15:45:03

标签: wpf templates wpf-controls parent onmouseclick

在我的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

2 个答案:

答案 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,它可以让你走过实际通过模板实例化控件的可视化树。