我有一个看起来像这样的上下文菜单
A
|--1
|--2
|--3
在选择1 2或3
之后,我需要访问调用上下文菜单的对象意思是如果这是textbox1的上下文菜单,那么我需要访问该对象,我该怎么做?
忘记提及,这是一个WPF应用程序。所以我使用System.Windows.Controls 并且以编程方式创建ContextMenu
答案 0 :(得分:7)
你可以走上树,从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;
//...
}
}
答案 1 :(得分:3)
您可以查看拥有已单击的上下文菜单项的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;
答案 2 :(得分:0)
使用
ContextMenu.SourceControl
这是调用上下文菜单的变量。你需要做的就是施放控件
答案 3 :(得分:0)
从类似的问题中找到答案
Get owner of context menu in code viky的代码有效,但我不得不施展两次。
我想循环使用Parent的转换可以获得更好的灵活性 (更多演员表取决于点击项目的深度)
答案 4 :(得分:0)
丑陋的解决方案
我正在寻找更好的方法来做同样的事情。目前,以下代码有效:
TextBlock tb = ((sender as MenuItem).Parent as ContextMenu).PlacementTarget as TextBlock;
将TextBlock
替换为您的对照类型。
答案 5 :(得分:0)
轻微调整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;
}