【问题标题】:WPF ComboBox: how to know when the item container (when was opened) lost focusWPF ComboBox:如何知道项目容器何时(何时打开)失去焦点
【发布时间】:2014-09-02 13:08:15
【问题描述】:

我想创建一种行为,其中ComboBox 下拉菜单在失去焦点时关闭。 我的第一次尝试是:

public class ComboBoxLostFocusBehavior : Behavior<ComboBox> {

    protected override void OnAttached() {
        base.OnAttached();

        AssociatedObject.LostFocus += (object sender, RoutedEventArgs e) => AssociatedObject.IsDropDownOpen = false;
    }
}

但 LostFocus 事件仅指切换部分,而不是项目容器。

如何参考下拉列表?

我想要:当下拉列表失去焦点时 -> 下拉列表正在关闭

编辑:

我认为这个问题被误解了。 ComboBox 有 2 个主要部分,关闭时看到的部分(我们称之为 A)和下拉列表(我们称之为 B)。 LostFocus 仅指 A 部分。因此,在我提出的有问题的场景中,这是错误的,您打开下拉列表,将鼠标从 A 移动到 B,当刚刚离开 A 并到达 B 时,B 关闭(通过行为)。所以总而言之,LostFocus 是错误的方法,我正在寻找其他暗示下拉 (B) 失去焦点的东西。

【问题讨论】:

  • 您的意思是当下拉菜单关闭时?或者当下拉菜单关闭时?或者当下拉菜单打开并失去焦点使其关闭时?
  • 当下拉关闭时,我认为,它不能成为焦点。因此,当打开下拉菜单而不是失去焦点时。如何捕捉这个?
  • 你应该使用 SelectionChanged 。你需要在 LostFocus 上做什么?
  • 选择更改不好,因为选择是(某种)多选。我的项目模板是带有复选框的值,在选择时您可以在关闭前检查一些。

标签: wpf combobox behavior


【解决方案1】:

如果我从问题/cmets 中正确理解了您,您想知道在打开下拉菜单后组合框是否失去焦点。

您可以在 LostFocus 事件中使用IsDropDownOpen 属性,例如

    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.LostFocus += (s, e) =>
            {
                if (AssociatedObject.IsDropDownOpen)
                {
                    //dropdown is open and control is loosing focus, you may perhaps want to close it
                    AssociatedObject.IsDropDownOpen = false;
                }
            };
    }

或者你可以附加DropDownOpened & DropDownClosed 事件并保持你自己的状态,例如

    bool isDropDownOpen;
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.DropDownOpened += (s, e) => isDropDownOpen = true;
        AssociatedObject.DropDownClosed += (s, e) => isDropDownOpen = false;

        AssociatedObject.LostFocus += (s, e) =>
            {
                if (isDropDownOpen)
                {
                    //dropdown is open and control is loosing focus, you may perhaps want to close it
                    AssociatedObject.IsDropDownOpen = false;
                }
            };
    }

或者根据需要以其他方式使用这些事件,例如

    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.DropDownClosed += (s, e) =>
            {
                //your action on dropdown close
            };
    }

【讨论】:

  • 我认为这里的问题被误解了,请查看编辑。
  • 我确实看到了您所做的编辑。感谢您是否也可以提供模拟相同的步骤?
  • 按步骤我的意思是如何模拟失去对下拉列表的关注?这是否意味着打开下拉列表B后单击组合控件A?还是别的什么?
  • 打开 A > 将鼠标从 A 移动到 B(B 获得焦点)> 离开 B(B 失去焦点) - 我希望 B 关闭
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2016-07-20
相关资源
最近更新 更多