WP7查找ContextMenu的所有者

时间:2010-12-30 05:32:01

标签: windows-phone-7 contextmenu

我通过读取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处理程序中检索此问题,但此解决方案感觉为有点难看。有更好的方法吗?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果您将sender作为UIElement投射到点击事件处理程序中,您应该能够获得所需的任何内容,以识别所点击的实际项目。

(sender as UIElement).Property

或者作为DependencyObject强制转换(如果可能)并使用它来遍历可视树:

VisualTreeHelper.GetParent((sender as DependencyObject))