2014-09-02 3 views
1

Я хочу создать поведение, при котором падение вниз закрывается при утрате фокуса. Моя первая попытка была:WPF ComboBox: как узнать, когда контейнер предметов (когда был открыт) потерял фокус

public class ComboBoxLostFocusBehavior : Behavior<ComboBox> { 

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

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

но LostFocus событие имеет в виду только тумблер части, а не контейнера элементов.

Как я могу обратиться к выпадающему списку?

Я хочу: , когда выпадающий список потерял фокус -> выпадающий закрывает

EDIT:

Я думаю, что вопрос неправильно. ComboBox имеет 2 основные части, часть, которую вы видите, когда она закрыта (позволяет называть ее A), и выпадающий список (позволяет называть его B). LostFocus ссылается только на часть A. Таким образом, в рассматриваемом мной сценарии, который является неправильным, вы открываете раскрывающийся список, перемещаете мышь от A до B, а когда просто оставляете A и прибываете B, B закрывается (по поведение). Таким образом, LostFocus - это неправильный способ пойти, и я ищу что-то еще, чтобы предположить, что падение (B) потеряло фокус.

enter image description here

+0

Вы имеете в виду, когда выпадающее меню закрыто? или когда выпадающее меню закрывается? или когда раскрывающийся список открыт и теряет фокус, который закрывает его? – pushpraj

+0

, когда выпадающее меню закрыто, я думаю, он не может быть в фокусе. Поэтому, когда раскрывающийся список открывается и чем теряется фокус. Как это сделать? – Keren

+0

вы должны выбрать SelectionChanged. Что вам нужно делать на LostFocus? –

ответ

0

Если я вас правильно понял из вопроса/комментария вы хотите знать, если выпадающее теряет фокус после открытия выпадающего.

вы можете использовать IsDropDownOpen свойство в LostFocus случае, например

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

Я думаю, что вопрос был неправильно истолкован здесь, см. Редактирование. – Keren

+0

Я видел редактирование, которое вы сделали. Оцените, можете ли вы также представить шаги для имитации того же? – pushpraj

+0

по шагам Я имею в виду, как имитировать потерянный фокус на выпадающем списке? означает ли это, что после открытия выпадающего списка «B» нажмите комбинацию «A»? или что-то другое? – pushpraj

 Смежные вопросы

  • Нет связанных вопросов^_^