我正在创建一个如下所示的ToolStripMenu,它允许用户与"XML“和"Non XML”项进行交互,就像它们是表单上的常规复选框一样。但是,当选中/取消选中某一项时,菜单将关闭。如何在不关闭菜单的情况下允许选中/取消选中项目?或者,是否有不同的标准方法来实现相同的行为?

所以我想要的是能够点击“非XML",显示一个复选框,并使菜单保持打开状态。这个想法是,最后一个菜单项将被“完成”,当它被点击时,"G2S“子项将保持打开状态,但”显示“子项( XML,Non XML )将关闭。
有什么想法吗?
注意:我知道这可能不是最好的用户界面设计。然而,我想知道如何做到这一点,仅仅是为了获得一些处理菜单的技术知识。
发布于 2012-11-13 09:18:31
有趣的概念在this thread on Stackoverflow中描述
以下是公认答案的精髓:
ParentMenu.DropDown.AutoClose = false;它所做的正是您所要求的--当单击子项时,防止菜单关闭。
发布于 2018-05-17 18:33:13
这是一个有用的扩展,它需要用户点击菜单项之外的+下拉菜单才能关闭。
public static void KeepOpenOnDropdownCheck (this ToolStripMenuItem ctl)
{
foreach (var item in ctl.DropDownItems.OfType<ToolStripMenuItem>())
{
item.MouseEnter += (o, e) => ctl.DropDown.AutoClose = false;
item.MouseLeave += (o, e) => ctl.DropDown.AutoClose = true;
}
}发布于 2012-11-13 08:32:00
发布了这篇文章,以防有人发现它有帮助。
我没有尝试做我最初想做的事情,而是想出了以下几点:
1-使用ContextMenuStrip
2-当用户点击ToolStripMenu项时,我会在菜单项附近的位置显示ContextMenuStrip,如下所示:(请注意,位置仍然需要调整)

为了使其工作,我在运行时在代码中构建ContextMenuStrip,以便可以根据情况动态构建ContextMenuStrip中的项。
代码片段:
单击菜单项时显示ContextMenuStrip:
private void filterToolStripMenuItem_Click(object sender, EventArgs e)
{
contextMenuStrip1.Show(this, 180, 20);
}构建ContextMenuStrip
if (protInfo.Name == "QCOM" )
{
BroadCast = new CheckBox();
BroadCast.Text = "Date/Time Broadcast";
BroadCast.Checked = FlagSet(CurrentFilter, (Byte)Filter.DateTimeBC);
ToolStripControlHost Ch1 = new ToolStripControlHost(BroadCast);
GenPoll = new CheckBox();
GenPoll.Text = "Status Poll";
GenPoll.Checked = FlagSet(CurrentFilter, (Byte)Filter.GenStatusPoll);
ToolStripControlHost Ch2 = new ToolStripControlHost(GenPoll);
GenPollResp = new CheckBox();
GenPollResp.Text = "Status Poll Response";
GenPollResp.Checked = FlagSet(CurrentFilter, (Byte)Filter.GenStatusResponse);
ToolStripControlHost Ch3 = new ToolStripControlHost(GenPollResp);
Button btnDone = new Button();
btnDone.Text = "Done";
ToolStripControlHost Ch4 = new ToolStripControlHost(btnDone);
btnDone.Click += new EventHandler(btnDone_Click);
contextMenuStrip1.Items.Clear();
contextMenuStrip1.Items.Add(Ch1);
contextMenuStrip1.Items.Add(Ch2);
contextMenuStrip1.Items.Add(Ch3);
contextMenuStrip1.Items.Add(Ch4);
contextMenuStrip1.Enabled = true;
filterToolStripMenuItem.Enabled = true;
}
else
{
filterToolStripMenuItem.Enabled = false;
}这可能不是最好的用户界面设计,但似乎是可行的。
https://stackoverflow.com/questions/13350171
复制相似问题