获取 DropDownMenu 的 SourceControl

2023-12-22

我在 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(使用前将#替换为@)

获取 DropDownMenu 的 SourceControl 的相关文章

随机推荐