获得上下文菜单的控制权
本文关键字:控制权 菜单 上下文 | 更新日期: 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
替换为控件的类型