Короткая история: 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>
Я использую перенаправленное событие Window.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 работать в пределах области фокусировки?
Или есть другой элемент управления списком, который лучше работает внутри фокусасфера?
Или я выбрал неправильный подход с помощью фокуса?Мои требования: пользователь должен иметь возможность выбрать элемент из прокручиваемого списка, который введет значение в текущее поле.Текущее поле не должно терять фокус.