2011-07-16 584 views
2

我有一个上下文菜单,看起来像这样获取上下文菜单

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

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

后的控制这意味着如果这是一个文本框1的上下文菜单,那么我需要访问该对象,我该怎么做?

忘了提及,这是一个WPF应用程序。因此Im使用System.Windows.Controls 和文本菜单中创建程序

+0

上下文菜单不需要拥有所有者控制。特别是对于TextBox而言,它实现了自己的上下文菜单。但是,如果您使用正确的方式来调用它,那么SourceControl是查找源代码管理的绝佳方式。一定要使用带控件的Show()方法。 –

+0

发现类似问题的答案 http://stackoverflow.com/questions/1884117/get-owner-of-context-menu-in-code viky的代码工作,但我不得不投它两次。(我想循环是可能的更好的灵活性) – Bg1987

回答

0

使用

ContextMenu.SourceControl 

这是调用上下文菜单中的变量。所有你需要做的就是投入控制

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; 
+0

我用MenuItem和ContextMenu类。 是否有区别使用ContextMenuStrips和只是一个ContextMenu和MenuItems(上下文菜单是动态生成的)除了SourceControl属性? – Bg1987

+0

对不起,我是WPF-dumb。 :( –

6

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

这是最简单和最好的解决方案。 –

0

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

Get owner of context menu in code VIKY的代码工作,但我不得不投了两次。

我猜循环家长的铸造,可以更好的灵活性 (更蒙上取决于被点击的项目有多深)

0

丑陋的解决方案

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

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

替换TextBlock与控件的类型。

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