【问题标题】:Close ComboBox DropDown on mouse leave event在鼠标离开事件时关闭 ComboBox DropDown
【发布时间】:2014-08-29 09:20:45
【问题描述】:

在开发简单的 Windows 窗体 UI 应用程序时,我正在尝试创建一种效果来显示和关闭鼠标事件的下拉菜单。

就像我可以通过设置comboBox.DroppedDown = true; 打开MouseMove 事件的下拉菜单一样 但是,当我在 MouseLeave 事件上设置 comboBox.DroppedDown = false; 以关闭它时,这同样不起作用。

不知道这里到底需要做什么。 问题出在MouseLeave 上,下拉菜单不会失去焦点,因此除非您从列表中选择一项,否则它不会关闭。它等待用户从列表中选择一个项目。 如果它可以失去对MouseLeave 的关注,就可以了。 请有任何建议。

【问题讨论】:

  • 当 DropDown 为 Down 时,鼠标 已捕获。关闭它会有所作为,但不会产生预期的结果。 Releasing Capture 的更好方法或将鼠标事件跟踪到外部控件的某种方法将是研究的方向..
  • 您可以让某种后台工作人员/计时器在表单上工作,检查鼠标位置(坐标)是否在组合框 + 组合框下拉菜单中。如果没有,您可以强制 DroppedDown 关闭。这会影响性能,但也应该可行。
  • 在 TimerTick 事件中使用 Bruno 的建议:` Point MP = new Point(Cursor.Position.X - this.Location.X,Cursor.Position.Y - this.Location.Y );大小 DDS = new Size(comboBox1.DropDownWidth, comboBox1.DropDownHeight);矩形 DDR = new Rectangle(new Point(comboBox1.Left, comboBox1.Top + comboBox1.Height) , DDS); if (!DDR.Contains(MP) ) { comboBox1.DroppedDown = false; timer2.Stop(); }`

标签: c# .net winforms combobox dropdownbox


【解决方案1】:

首先我必须说我不是一个经验丰富的程序员,我刚开始使用 WPF。 我知道这个问题已经有两年了,但我遇到了同样的问题,我发现我可以使用事件 IsMouseDirectlyOverChanged 关闭 ComboBox 的下拉列表。对我来说真正烦人的是我有一个 ComboBox 和一个按钮,如果在没有进行选择的情况下打开下拉菜单并且我想单击该按钮,则第一次单击时没有任何反应,因为第一次单击下拉菜单菜单正在关闭。在此之后,我可以单击按钮。

对我来说它工作正常:如果我在任何方向(上、左、下、右)移动鼠标,下拉列表将关闭,并且一条消息会附加到文本框控件。我不知道这个事件是新事物还是2年前也可以使用。

private void comPortList_IsMouseDirectlyOverChanged(object sender, DependencyPropertyChangedEventArgs e)
    {

        if (comPortList.IsDropDownOpen==true)
        {
            txtMsgBox.AppendText("MouseDirectlyOverChanged\n");
            txtMsgBox.ScrollToEnd();
            comPortList.IsDropDownOpen = false;
        }

    }

当您的鼠标指针悬停在打开的 ComboBox 上时会触发此事件。如果不打开下拉列表,则不会触发。

我看到的另一件事是,当您进入打开的 ComboBox 以及离开它时会触发此事件。如果我在检查 IsDropDownOpen 属性是否为 true 之前附加文本,则当鼠标指针离开打开的 ComboBox 时,文本“MouseDirectlyOverChanged”将在我的文本框中出现两次。

如果我评论该行:

comPortList.IsDropDownOpen = false;

并在 if 之前保留 AppendText 和 ScrollToEnd,文本只会追加一次。

我希望这会有所帮助:)

【讨论】:

    【解决方案2】:

    在我看来,您需要使用 MouseEnter 事件而不是 MouseMove。它在 MouseLeave 上不起作用的原因是因为您的鼠标正在移动,而这只会再次将其设置为 true。

    【讨论】:

    • 不幸的是,这也不起作用。我刚才试过了。
    猜你喜欢
    • 2017-08-05
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多