【问题标题】:WPF ComboBox dropdown is preventing clicking other controlsWPF ComboBox 下拉菜单阻止单击其他控件
【发布时间】:2017-02-25 08:28:35
【问题描述】:

我有一个这样的简单表格:

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

文本框也有同样的问题。当下拉菜单打开时,文本框点击不起作用。

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

【问题讨论】:

  • 贴出xaml的代码
  • 没有代码。只是一个按钮点击的消息框。
  • XAML 代码,即设计
  • 当你打开CB时,它会获得焦点,并且在它之外再次单击它会自行关闭。这是默认行为。
  • 我认为最好的方法是:Look at this

标签: wpf combobox dropdown


【解决方案1】:

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

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

【讨论】:

  • 我希望在打开下拉菜单时单击该按钮。如何覆盖默认方式?
【解决方案2】:

您可以为 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));
}

然后在 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2012-12-19
    相关资源
    最近更新 更多