Winforms ContextMenuStrip问题中的组合框

Winforms ContextMenuStrip问题中的组合框,winforms,events,combobox,contextmenu,Winforms,Events,Combobox,Contextmenu,给定以下疯狂设置(ContextMenuStrip内ToolStripControlHost内UserControl内的组合框): 单击组合框弹出窗口中的不同项目时会出现一些奇怪的情况。如果项目在菜单范围内(即阿姆斯特丹、布鲁塞尔或卢森堡),则选中该项目。如果项目超出菜单范围(即Berlijn和其他),菜单将立即关闭 忽略任何关于“完全疯狂”的尖刻评论,有人知道发生了什么,以及如果选择了一个遥远的组合框项目,如何阻止菜单关闭吗?问题是由于ToolStripManager中的深层检查确定鼠标事件

给定以下疯狂设置(ContextMenuStrip内ToolStripControlHost内UserControl内的组合框):

单击组合框弹出窗口中的不同项目时会出现一些奇怪的情况。如果项目在菜单范围内(即阿姆斯特丹、布鲁塞尔或卢森堡),则选中该项目。如果项目超出菜单范围(即Berlijn和其他),菜单将立即关闭


忽略任何关于“完全疯狂”的尖刻评论,有人知道发生了什么,以及如果选择了一个遥远的组合框项目,如何阻止菜单关闭吗?

问题是由于ToolStripManager中的深层检查确定鼠标事件不在子菜单上

基本上,如果显示组合框,则需要拒绝ContextMenuStrip.OnClosing事件。不可避免地会有一个更干净的解决方案,但我没有看到

public bool IsDropDownShowing { get; private set; }
private void InitializeContextMenu()
{
    var userControl = new ComboMenuUserControl();
    var toolStripHost = new ToolStripControlHost(userControl);
    contextMenuStrip1.Items.Add(toolStripHost);

    userControl.comboBox1.DropDown += (o, args) => IsDropDownShowing = true;
    userControl.comboBox1.DropDownClosed += (o, args) => IsDropDownShowing = false;

    contextMenuStrip1.Closing += (o, args) =>
                                    {
                                        if (IsDropDownShowing == true)
                                            args.Cancel = true;
                                    };
}

问题是由于ToolStripManager中的深层检查确定鼠标事件不在子对象上

基本上,如果显示组合框,则需要拒绝ContextMenuStrip.OnClosing事件。不可避免地会有一个更干净的解决方案,但我没有看到

public bool IsDropDownShowing { get; private set; }
private void InitializeContextMenu()
{
    var userControl = new ComboMenuUserControl();
    var toolStripHost = new ToolStripControlHost(userControl);
    contextMenuStrip1.Items.Add(toolStripHost);

    userControl.comboBox1.DropDown += (o, args) => IsDropDownShowing = true;
    userControl.comboBox1.DropDownClosed += (o, args) => IsDropDownShowing = false;

    contextMenuStrip1.Closing += (o, args) =>
                                    {
                                        if (IsDropDownShowing == true)
                                            args.Cancel = true;
                                    };
}

谢谢约翰,看起来很有希望。谢谢约翰,看起来很有希望。