获得上下文菜单的控制权

我有一个看起来像这样的上下文菜单

A |--1 |--2 |--3 

在选择1 2或3之后,我需要访问调用上下文菜单的对象

这意味着如果这是textbox1的上下文菜单,那么我需要访问该对象,我该怎么做?

忘了提一下,这是一个WPF应用程序。 所以我使用System.Windows.Controls和ContextMenu是以编程方式创建的

您可以走上树并从ContextMenu.PlacementTarget获取控件,例如

 private void MenuItem_Click(object sender, RoutedEventArgs e) { var item = sender as MenuItem; while (item.Parent is MenuItem) { item = (MenuItem)item.Parent; } var menu = item.Parent as ContextMenu; if (menu != null) { var droidsYouAreLookingFor = menu.PlacementTarget as TextBox; //... } } 

您可以查看拥有已单击的上下文菜单项的ContextMenuStrip的SourceControl属性。

例如,在菜单项的Click处理程序中:

 private void aToolStripMenuItem_Click(object sender, EventArgs e) { var control = ((sender as ToolStripMenuItem).Owner as ContextMenuStrip).SourceControl; ... } 

当然,如果表单上只有一个ContextMenuStrip,您可以直接引用它

 var control = myContextMenuStrip.SourceControl; 

使用

 ContextMenu.SourceControl 

这是调用上下文菜单的变量。 所有你需要做的就是施放控件

从类似的问题中找到答案

在代码 viky的代码工作中获取上下文菜单的所有者 ,但我不得不投两次。

我想循环父级的转换可以获得更好的灵活性(更多的强制转换取决于所点击的项目有多深)

难看的解决方案

我正在寻找一种更好的方法来做同样的事情。 目前,以下代码有效:

 TextBlock tb = ((sender as MenuItem).Parent as ContextMenu).PlacementTarget as TextBlock; 

TextBlock替换为您的控件类型。

稍微调整一下HB的答案。 HB值得信赖。 帮我找到了一个DataGrid。

 private void MenuItem_Click(object sender, RoutedEventArgs e) { MenuItem item = sender as MenuItem; ContextMenu cm = (ContextMenu)item.Parent; Popup popup = (Popup)cm.Parent; var finalGoal = popup.PlacementTarget as DataGrid; }