WPF ComboBox下拉列表阻止点击其他控件

时间:2016-10-16 07:36:21

标签: wpf combobox dropdown

我有一个这样的简单形式:

enter image description here

我打开组合框,当时下拉列表打开,我点击按钮。单击按钮时,我显示一条简单的消息,但当时未显示该消息。 它显示我再次点击它。

文本框的问题相同。下拉列表打开时,文本框单击无效。

为什么组合框在打开时会阻止点击其他控件?

2 个答案:

答案 0 :(得分:1)

您可以为ComboBox DropDownClosed创建一个事件,并使用hittestfunction找到该用户点击的另一个控件。

private void ComboBox_DropDownClosed(object sender, EventArgs e)
{
    Point m = Mouse.GetPosition(this);
    VisualTreeHelper.HitTest(this, this.FilterCallback, this.ResultCallback, new PointHitTestParameters(m));
}

然后在找到该控件后的FilterCallback函数中,在该控件上引发鼠标按下事件。

private HitTestFilterBehavior FilterCallback(DependencyObject o)
{
    var c = o as Control;
    if ((c != null) && !(o is MainWindow))
    {
        if (c.Focusable)
        {
            if (c is ComboBox)
            {
                (c as ComboBox).IsDropDownOpen = true;
            }
            else
            {
                var mouseDevice = Mouse.PrimaryDevice;
                var mouseButtonEventArgs = new MouseButtonEventArgs(mouseDevice, 0, MouseButton.Left)
                {
                    RoutedEvent = Mouse.MouseDownEvent,
                    Source = c
                };
                c.RaiseEvent(mouseButtonEventArgs);
            }

            return HitTestFilterBehavior.Stop;
        }
    }
    return HitTestFilterBehavior.Continue;
}

private HitTestResultBehavior ResultCallback(HitTestResult r)
{
    return HitTestResultBehavior.Continue;
}

答案 1 :(得分:0)

组合框的实现方式是在下拉列表打开时捕获鼠标。这样做可以轻松找出用户何时点击组合框外部(实际上它是一个单行)。当用户点击组合框外部时,它会释放鼠标,关闭下拉列表并将点击标记为已处理。最后一个操作当然会停止进一步处理,并且点击不会传递给您认为单击的控件。

我个人认为这种行为有利有弊。微软决定了它的方式。