【问题标题】:Getting the control of a context menu获得上下文菜单的控制权
【发布时间】:2011-07-16 21:29:13
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 上下文菜单不需要拥有所有者控件。尤其不是对于 TextBox,它实现了自己的上下文菜单。但是,如果您使用正确的方法来调用它,那么 SourceControl 是找回源代码控制的绝佳方式。请务必使用带有 Control 的 Show() 方法。
  • 从类似问题stackoverflow.com/questions/1884117/…viky 的代码中找到了答案,但我不得不投了两次。 (我猜循环可能会获得更好的灵活性)

标签: c# .net wpf contextmenu


【解决方案1】:

你可以爬上树并从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;
        //...
    }
}

【讨论】:

  • 这是最简单最好的解决方案。
【解决方案2】:

您可以查看 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;

【讨论】:

  • 我使用了 MenuItem 和一个 ContextMenu 类。除了 SourceControl 属性之外,使用 ContextMenuStrips 与仅使用 ContextMenu 和 MenuItems(上下文菜单是动态生成的)之间有区别吗?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    使用

    ContextMenu.SourceControl
    

    这是调用上下文菜单的变量。您需要做的就是投射控制权

    【讨论】:

      【解决方案5】:

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

      Get owner of context menu in code viky 的代码有效,但我不得不投两次。

      我想循环对 Parent 的强制转换是可能的以获得更好的灵活性 (更多的演员取决于点击的项目有多深)

      【讨论】:

        【解决方案6】:

        丑陋的解决方案

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

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

        TextBlock 替换为您的控件类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-25
          • 1970-01-01
          相关资源
          最近更新 更多