Эту проблему можно решить с помощью следующей проверки:
private void myComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() == typeof(ComboBoxItem))
return;
//Your code here
}
Этот код отфильтрует все события фокуса от предметов (поскольку они используют событие пузырьковой маршрутизации).Но есть еще одна проблема - специфическое поведение фокуса WPF ComboBox: когда вы открываете выпадающий список с элементами, ваш ComboBox теряет фокус и элементы получают.При выборе какого-либо предмета - предмет теряет фокус и ComboBox возвращается.Выпадающий список похож на другой элемент управления.Вы можете увидеть это по простому коду:
private void myComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem))
{
Trace.WriteLine("Got " + DateTime.Now);
}
}
private void myComboBox_LostFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem))
{
Trace.WriteLine("Lost " + DateTime.Now);
}
}
Таким образом, вы все равно получите по крайней мере два события фокуса: когда вы выбираете ComboBox и когда вы выбираете что-то в нем (фокус возвращается к ComboBox).
Чтобы отфильтровать возвращенный фокус после выбора элемента, вы можете попробовать использовать DropDownOpened
/ DropDownClosed
события с некоторым полем-флагом.
Итак, итоговый код только с одним событием получения фокуса:
private bool returnedFocus = false;
private void myComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem) && !returnedFocus)
{
//Your code.
}
}
private void myComboBox_LostFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem))
{
ComboBox cb = (ComboBox)sender;
returnedFocus = cb.IsDropDownOpen;
}
}
Выберите из этого примера то, что вам действительно нужно для вашего приложения.