我有一个上下文菜单,看起来像这样获取上下文菜单
A
|--1
|--2
|--3
我需要访问的上下文菜单从调用时,对象选择1 2或3
后的控制这意味着如果这是一个文本框1的上下文菜单,那么我需要访问该对象,我该怎么做?
忘了提及,这是一个WPF应用程序。因此Im使用System.Windows.Controls 和文本菜单中创建程序
我有一个上下文菜单,看起来像这样获取上下文菜单
A
|--1
|--2
|--3
我需要访问的上下文菜单从调用时,对象选择1 2或3
后的控制这意味着如果这是一个文本框1的上下文菜单,那么我需要访问该对象,我该怎么做?
忘了提及,这是一个WPF应用程序。因此Im使用System.Windows.Controls 和文本菜单中创建程序
使用
ContextMenu.SourceControl
这是调用上下文菜单中的变量。所有你需要做的就是投入控制
你可以看看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类。 是否有区别使用ContextMenuStrips和只是一个ContextMenu和MenuItems(上下文菜单是动态生成的)除了SourceControl属性? – Bg1987
对不起,我是WPF-dumb。 :( –
你可以走上树并从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;
//...
}
}
这是最简单和最好的解决方案。 –
找到了答案,从一个类似的问题
Get owner of context menu in code VIKY的代码工作,但我不得不投了两次。
我猜循环家长的铸造,可以更好的灵活性 (更蒙上取决于被点击的项目有多深)
丑陋的解决方案
我在寻找一个更好的方式来做同样的事。现在,下面的代码工作:
TextBlock tb = ((sender as MenuItem).Parent as ContextMenu).PlacementTarget as TextBlock;
替换TextBlock
与控件的类型。
对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;
}
上下文菜单不需要拥有所有者控制。特别是对于TextBox而言,它实现了自己的上下文菜单。但是,如果您使用正确的方式来调用它,那么SourceControl是查找源代码管理的绝佳方式。一定要使用带控件的Show()方法。 –
发现类似问题的答案 http://stackoverflow.com/questions/1884117/get-owner-of-context-menu-in-code viky的代码工作,但我不得不投它两次。(我想循环是可能的更好的灵活性) – Bg1987