WPF ComboBox: как узнать, когда контейнер элемента (когда он был открыт) потерял фокус
Я хочу создать поведение, в котором 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) потерял фокус.
1 ответ
Если я правильно понимаю вас из вопроса / комментариев, вы хотите знать, теряет ли фокус выпадающий список после открытия раскрывающегося списка.
Вы можете использовать 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
};
}