【问题标题】:Get the SourceControl of a DropDownMenu获取 DropDownMenu 的 SourceControl
【发布时间】:2019-04-15 03:00:42
【问题描述】:

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

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

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

如何在第二个屏幕截图的菜单项的单击事件中获取 SourceControl?

【问题讨论】:

  • 在打开ContextMenu 时设置一个字段(类似于Control CurrentContextMenuOwner)可能更简单。订阅Opened() 事件并设置CurrentContextMenuOwner = (sender as ContextMenuStrip).SourceControl;。在任何ToolStripMenuItems 中,您都可以使用CurrentContextMenuOwner 引用来访问控件的属性。在ContextMenuClosing()Closed() 事件中将CurrentContextMenuOwner 设置为null。
  • 据我所知,这是ContextMenuStrip 中的一个错误,从一开始就存在。你基本上必须按照@Jimi 的建议去做。如果您愿意,您可能可以继承 ContextMenuStrip 并在内部进行,但如果它是一次性的,那么字段是最简单的选择。

标签: c# .net vb.net winforms contextmenustrip


【解决方案1】:

可以从ToolStripMenuItem 检索ContextMenuStrip SourceControl(激活上下文菜单的当前控件的引用),检查OwnerItem 引用并向上移动直到OwnerItem 引用为null,然后检查引用 ContextMenuStripOwner 值。
(很遗憾,SourceControl 引用仅在 ContextMenuStrip 控件中可用。

一种简单的替代方法是使用引用ControlField,其中当前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;
}

【讨论】:

  • 很抱歉在这里问,但我怎样才能得到颜色的相反颜色?当我有白色时,黑色是相反的等等......
  • Color OppositeColor = Color.FromArgb(Color.White.ToArgb() ^ 0xffffff); 简化版。相反的颜色取决于颜色domain。计算起来可能要复杂得多,具体取决于目的地。
猜你喜欢
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2014-10-29
相关资源
最近更新 更多