WPF ComboBox:如何知道项目容器(何时打开)失去焦点

时间:2014-09-02 13:08:15

标签: wpf combobox behavior

我想创建一种行为,当失去焦点时,ComboBox下拉列表正在关闭。 我的第一次尝试是:

public class ComboBoxLostFocusBehavior : Behavior<ComboBox> {

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

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

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

如何参考下拉列表?

我想:当下拉列表丢失焦点时 - &gt;下拉正在关闭

修改

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

enter image description here

1 个答案:

答案 0 :(得分:0)

如果我从问题/评论中正确理解你,你想知道在打开下拉列表后组合框是否会失去焦点。

您可以在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&amp; 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
            };
    }