获取 DropDownMenu 的 SourceControl

Get the SourceControl of a DropDownMenu

我在 ContextMenuStrip 中有两个菜单项的点击事件。
我可以通过执行以下代码获取单击的上下文菜单项的 SourceControl:

Control c = ((sender as ToolStripItem).Owner as ContextMenuStrip).SourceControl;

但是当我在另一个级别的上下文菜单项上使用此代码时,returns null。

如何在第二张截图的菜单项的点击事件中获取SourceControl?

ContextMenuStrip SourceControl (the reference of the current Control where the Context Menu is activated) can be retrieved, from a ToolStripMenuItem, inspecting the OwnerItem reference and moving upstream until the OwnerItem reference is null, then inspecting the Owner 值,它引用 ContextMenuStrip
(不幸的是,SourceControl 引用仅在 ContextMenuStrip 控件中可用。

一种简单的替代方法是使用 Field 引用 Control,其中当前 ContextMenuStrip 已被激活(您可以只有一个激活的 ContextMenuStrip)。
此字段引用在 ContextMenuStrip 打开时设置 - 通过订阅 Opened() 事件 - 然后可以由任何 ToolStripMenuItem.
访问 然后,当 ContextMenuStrip 关闭时,字段引用将设置回 null

▶ 表单关闭时处理 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;
}