获取上下文菜单的控制权

时间:2011-07-16 21:29:13

标签: c# .net wpf contextmenu

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

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

在选择1 2或3

之后,我需要访问调用上下文菜单的对象

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

忘记提及,这是一个WPF应用程序。所以我使用System.Windows.Controls 并且以编程方式创建ContextMenu

6 个答案:

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