Краткая история: ListBox внутри области фокуса не позволяет выбрать элемент.
Длинная история:
Я пытаюсь создать контекстно-зависимый виджет для ввода данных. У меня основная панель с несколькими полями. Ниже у меня есть панель с FocusManager.FocusScope = "True"
. Эта панель будет заполнена соответствующим виджетом для поля, которое в данный момент находится в фокусе. Например, при выборе поля даты в нижней части экрана отобразится календарь.
У меня есть несколько элементов управления, которые требуют от пользователя выбора одного из множества значений из списка. Я помещаю ListBox в область фокуса, но не могу выбрать какие-либо элементы. Когда что-то выбрано (программно) и вы щелкаете ListBox, он отменяет выбор всего.
Я протестировал несколько событий, и он не улавливает события MouseDown, но улавливает события MouseMove. Он запускает GotFocus всякий раз, когда я нажимаю на элемент, но никогда не запускает LostFocus. Я не уверен, что это значит, но надеюсь, что это может быть полезно для тех, кто это читает.
Вот код, который я использую для отображения контекстно-зависимого виджета. В моем окне есть следующий код XAML:
<Grid x:Name="EntryWidget" FocusManager.IsFocusScope="True">
<Grid.Resources>
<ListBox x:Key="List" ItemsSource="{Binding}" />
</Grid.Resources>
</Grid>
Я использую окно.Перенаправленное событие GotFocus для обновления виджета до соответствующего элемента управления, например:
private void Window_GotFocus(object sender, RoutedEventArgs e)
{
FrameworkElement focus = (FrameworkElement)FocusManager.GetFocusedElement(this);
EntryWidget.Children.Clear(); // Could this be the culprit?
object tag = focus.Tag;
if (tag != null)
{
if (EntryWidget.Resources.Contains(tag))
{
EntryWidget.Children.Add(EntryWidget.Resources[tag] as UIElement);
}
}
}
Итак:
Есть ли способ заставить ListBox работать в пределах области фокуса?
Или есть другой элемент управления списком, который работает лучше внутри области видимости?
Или я использую неправильный подход, используя прицелы фокусировки? Мои требования: пользователь должен иметь возможность выбрать элемент из прокручиваемого списка, который будет вводить значение в текущее поле. Текущее поле не должно терять фокус.