获得上下文菜单的控制权

本文关键字:控制权 菜单 上下文 | 更新日期: 2023-09-27 18:02:23

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

 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;

对HB的回答稍作调整。HB值得赞扬。帮我找到了一个数据网格。

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; 
}

使用

ContextMenu.SourceControl

是调用上下文菜单的变量。您所需要做的就是强制转换控件

从一个类似的问题中找到了答案

获取代码中上下文菜单的所有者viky的代码可以工作,但我不得不强制转换两次。

我想,为了更好的灵活性,循环父类的强制转换是可能的(更多的强制类型转换取决于所单击项的深度)

解决方案

我正在寻找一个更好的方法来做同样的事情。现在,下面的代码可以工作:

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

TextBlock替换为控件的类型