WPF ComboBox下拉框阻止了单击其他控件

3

我有一个简单的表单,如下所示:

enter image description here

我打开下拉框,此时下拉菜单已经打开,我点击按钮。在按钮点击时,我显示了一条简单的消息,但是该消息此时没有显示出来。只有当我再次点击它时才会显示出来。

对于文本框也存在同样的问题。当下拉菜单打开时,无法点击文本框。

为什么下拉框在打开时会阻止其他控件的点击?


发布XAML代码 - Sajeetharan
没有代码,只有一个按钮点击的消息框。 - MSL
XAML代码,它是设计的基础。 - Sajeetharan
当您打开CB时,它会获得焦点,再次单击其外部区域,它将自动关闭。这是默认行为。 - AnjumSKhan
我认为最好的方法是这样做:看这里 - abcdefgh
2个回答

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;
}

0

组合框实现了当下拉列表展开时,捕获鼠标的方式。这样做是为了更轻松地确定用户何时单击组合框之外的区域(实际上它只需要一行代码)。当用户单击组合框之外的区域时,它会释放鼠标、关闭下拉列表并将点击标记为已处理。最后一个操作当然会停止进一步的处理,并且点击不会传递到您认为已单击的控件。

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


当下拉菜单打开时,我希望按钮被点击。如何覆盖默认方式? - MSL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接