C# WPF组合框:在弹出窗口外单击抑制鼠标单击

C# WPF组合框:在弹出窗口外单击抑制鼠标单击,c#,wpf,combobox,behavior,dropdown,C#,Wpf,Combobox,Behavior,Dropdown,我使用标准的WPF组合框控件。当弹出窗口打开且用户单击外部某处时,弹出窗口关闭。但是,如果窗口上有一个按钮,并且用户单击该按钮(弹出窗口仍然打开),则不会执行按钮的单击处理程序。弹出窗口已关闭,但用户必须再次单击该按钮以引发其上的单击事件 我知道这是此控件的标准行为。你知道如何绕过这种行为吗?谢谢 您可以尝试在组合框获得鼠标捕获后立即释放鼠标捕获: 在XAML的组合框属性中: GotMouseCapture="ComboBox_OnGotMouseCapture" 在代码隐藏中: privat

我使用标准的WPF组合框控件。当弹出窗口打开且用户单击外部某处时,弹出窗口关闭。但是,如果窗口上有一个按钮,并且用户单击该按钮(弹出窗口仍然打开),则不会执行按钮的单击处理程序。弹出窗口已关闭,但用户必须再次单击该按钮以引发其上的单击事件


我知道这是此控件的标准行为。你知道如何绕过这种行为吗?谢谢

您可以尝试在组合框获得鼠标捕获后立即释放鼠标捕获: 在XAML的组合框属性中:

GotMouseCapture="ComboBox_OnGotMouseCapture"
在代码隐藏中:

private void ComboBox_OnGotMouseCapture(object sender, MouseEventArgs e)
{
    ComboBox.ReleaseMouseCapture();
}

您可以为ComboBox DropDownClosed创建一个事件,并使用HitTest函数查找用户单击的其他控件

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

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;
}
找到该控件后,在FilterCallback函数中,在该控件上引发鼠标按下事件

我发现raise事件在组合框上不起作用,因此单击它,我只需将IsDropDownOpen设置为true

我在中找到了代码并对其进行了一些修改。

我使用了一个简单的解决方案: 在PreviewMouseLeftButtonDown事件中,如果鼠标位置在组合框之外,请关闭下拉列表。这将允许其他控件单击鼠标:

Dim p = Mouse.GetPosition(combo)
If p.X < 0 OrElse p.Y < 0 OrElse p.X > combo.Width OrElse p.Y > combo.Height Then
     cmb.IsDropDownOpen = False
End If
Dim p=Mouse.GetPosition(组合)
如果p.X<0或p.Y<0或p.X>组合宽度或p.Y>组合高度,则
cmb.IsDropDownOpen=错误
如果结束

对我来说,情况并非如此。按钮单击事件在弹出窗口关闭后引发。是否使用WPF?标准控制?您的.net framework版本是什么?这将阻止下拉列表发表意见