我在 ContextMenuStrip 中有两个菜单项的单击事件。
我可以通过执行以下代码获取单击的上下文菜单项的 SourceControl:
Control c = ((sender as ToolStripItem).Owner as ContextMenuStrip).SourceControl;
但是,当我在另一个级别的上下文菜单项上使用此代码时,它返回 null。
如何在第二个屏幕截图的菜单项的单击事件中获取 SourceControl?
The 上下文菜单条 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.contextmenustrip 源代码控制 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.contextmenustrip.sourcecontrol(激活上下文菜单的当前控件的引用)可以从工具条菜单项 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.toolstripmenuitem,检查所有者项目 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.toolstripitem.owneritem参考并向上游移动,直到OwnerItem
参考是null
,然后检查Owner https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.toolstripitem.owner值,它引用了ContextMenuStrip
.
(不幸的是,SourceControl
参考仅在ContextMenuStrip
控制)。
一个简单的替代方法是使用Field
引用了Control
当前的位置ContextMenuStrip
已被激活(您只能有一个激活的ContextMenuStrip
).
该字段引用,设置时ContextMenuStrip
打开 - 通过订阅Opened() https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.toolstripdropdown.opened事件 - 然后可以由任何ToolStripMenuItem
.
然后将字段引用设置回null
那时ContextMenuStrip
关闭了。
▶ 废弃处理contextMenuOwner
窗体关闭时对象。
一个例子:
(toolStripMenuItem
是通用名称,必须设置为实际的控件名称)。
Control contextMenuOwner = null;
private void toolStripMenuItem_Click(object sender, EventArgs e)
{
contextMenuOwner?.BackColor = Color.Blue;
//(...)
}
private void contextMenuStrip1_Opened(object sender, EventArgs e)
{
contextMenuOwner = (sender as ContextMenuStrip).SourceControl;
}
private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e)
{
contextMenuOwner = null;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)