获得上下文菜单的控制权
我有一个看起来像这样的上下文菜单
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; }