Я разрабатываю приложение с wpf, в котором текстовое поле всегда фокусируется, в то время как все остальные элементы управления никогда не фокусируются, для достижения этого я установил свойство IsFocusable = false
для всех элементов управления.
Одним из этих элементов управления является ListBox, и если я устанавливаю свойство IsFocusable = false
, элементы ListBox становятся недоступными для выбора, но мне нужно иметь возможность выбирать эти элементы.
Решения, которые я нашел, не очень элегантны и чисты.
Одним из решений является использование ItemControl со стилизованным RadioButton в качестве элементов, а затем привязка события щелчка RadioButton с помощью некоторых методов в моей модели представления
Другое решение состоит в том, чтобы использовать прикрепленное поведение для захвата события нажатия мыши в ListBox, затем найти, какой элемент расположен в координатах мыши, и затем попытаться установить этот элемент в качестве выбранного элемента, но если я просто установлю свойство SelectedItem из ничего не происходит в привязанном поведении.
Существует ли более элегантный и эффективный способ сделать элементы не сфокусированного списка ListBox доступными для выбора?
Edit:
Другое возможное решение - зарегистрировать обработчик класса для события donw левой кнопки мыши, используя EventManager:
EventManager.RegisterClassHandler(typeof(ListBoxItem),
ListBoxItem.MouseLeftButtonDownEvent,
new RoutedEventHandler((s, o) =>
{ (s as ListBoxItem).IsSelected = true; }));
Обработчики классов вызываются перед любыми другими обработчиками событий и для всех элементов управления указанного типа (в данном случае ListBoxItem) во всем приложении
Это лучшее решение, которое я нашел с тех пор