6

在我的 WPF 项目中,我有一些复杂的控制。在项目中,除了 MainWindow 之外,我只使用控件(它们都是模板化的)。

在一个屏幕上,我有以下布局(用于在应用模板和填充内容后显示布局):

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

当我在 ScreenControl 的代码文件中时,在 OnMouseLeftButtonDown 方法中,我想确定单击事件是来自 MyHeaderControl 还是来自 MyItemControl。

MouseButtonEventArgs 的 Source 是 ScreenControl,OriginalSource 是 MyItemControl/MyHeaderControl 模板中的 TextBlock。

我第一次尝试查找 MyItemControl/MyHeaderControl 是从 OriginalSource 开始并递归查看 Parent 属性的类型。它工作正常,直到我到达模板的根(在本例中为 ViewBox),但根没有父元素。

我在我早期的项目中使用过这样的方法并且它有效,但后来我使用的是用户控件,而不是控件,也不是模板。

有什么想法我应该如何解决这个问题(一个好主意就像代码一样受欢迎)?

谢谢,天志子

4

2 回答 2

7

您是否尝试过简单地获取 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

于 2010-12-02T16:14:24.717 回答
3

查看VisualTreeHelper.GetParent,它可以让您浏览可视化树,其中控件已通过模板实际实例化。

于 2010-12-02T15:48:34.093 回答