我通过读取XML文件动态填充应用程序中StackPanel
的内容。 StackPanel
的每个孩子本身就是另一个StackPanel
,其中包含不同的UIElement
个对象。嵌套StackPanel
设计的原因是因为我想将3个不同的ContextMenu
中的一个与这些子StackPanel
相关联。
所以结构看起来像这样:
---- StackPanel parent
|
---- StackPanel child
| |
| ---- TextBlock
|
---- StackPanel child
| |
| ---- TextBox
|
---- StackPanel child
| |
| ---- Image
|
.
.
.
对于我在3 StackPanel
中选择的每个ContextMenu
孩子,并将其附加如下:
var stackPanels = parentStackPanel.Children.OfType<StackPanel>();
for( int i = 0; i < stackPanels.Count(); ++i ) {
if( someCondition ) {
ContextMenuService.SetContextMenu( stackPanels.ElementAt( i ), MyContextMenu1 );
} else if( someOtherCondition ) {
ContextMenuService.SetContextMenu( stackPanels.ElementAt( i ), MyContextMenu2 );
} else {
ContextMenuService.SetContextMenu( stackPanels.ElementAt( i ), MyContextMenu3 );
}
}
所有3 MenuItem
下的所有ContextMenu
都具有相同的Click
处理程序。
现在,最后,问题是:如何确定调用和点击了哪个StackPanel
孩子的ContextMenu
?检查调试器中单击处理程序中的发件人对象,表明ContextMenu
有一个名为internal
的{{1}} DependencyObject
,其中包含对Owner
的引用,正是我想要的,但当然,我无法以代码的方式访问它。
我可以通过向每个子StackPanel
添加MouseLeftButtonDown
处理程序来解决问题,保存上次选择的处理程序,然后在StackPanel
处理程序中检索此问题,但此解决方案感觉为有点难看。有更好的方法吗?
提前感谢您的帮助!
答案 0 :(得分:1)
如果您将sender
作为UIElement
投射到点击事件处理程序中,您应该能够获得所需的任何内容,以识别所点击的实际项目。
(sender as UIElement).Property
或者作为DependencyObject强制转换(如果可能)并使用它来遍历可视树:
VisualTreeHelper.GetParent((sender as DependencyObject))