Перемещение фокуса клавиатуры от ListBox - PullRequest
1 голос
/ 28 марта 2009

Я разрабатываю программу в WPF (VB), которая использует только навигацию с клавиатуры.

В моей программе есть список, отображающий до 20000 элементов.

Что мне нужно, так это чтобы в окне списка был фокус с клавиатуры, и я перешел к нижнему видимому элементу (используя ArrowDown), я бы хотел, чтобы фокус переместился к следующему элементу вне списка. Я использую PgUp и PgDown для прокрутки содержимого списка и текстового поиска для перехода к элементам.

Есть ли способ определить, является ли сфокусированный / выбранный элемент последним / первым видимым элементом в списке?

Если это так, я мог бы просто использовать:

ListBox1.MoveFocus(New TraversalRequest(FocusNavigationDirection.Down))

Ответы [ 3 ]

2 голосов
/ 28 марта 2009

Я бы посоветовал вам этого не делать, пользовательский интерфейс должен согласованно работать с другими пользовательскими интерфейсами в операционной системе.

Вашим пользователям будет лучше, если вы создадите альтернативный пользовательский интерфейс, который согласуется с поведением пользовательских интерфейсов в вашей целевой операционной системе.

0 голосов
/ 23 октября 2014

Я использую простой трюк, чтобы переместить фокус за пределы списка: Я отключаю список, чтобы фокус автоматически перемещался к следующему элементу управления, затем снова включаю список:)

Lst.IsEnabled = False
Lst.MoveFocus(New TraversalRequest(FocusNavigationDirection.Next))
Lst.IsEnabled = True
0 голосов
/ 10 февраля 2011

Это немного ясно из вашего объяснения, но либо вы ищете:

  1. навигация для перемещения за пределы списка, когда выбран последний элемент.
  2. при попытке перехода за пределы последнего элемента в списке, который отображается из списка.

Если ( 1 ) является вашей целью, вероятно, есть разумное решение с использованием триггеров и / или некоторой пользовательской обработки кода для событий, основанных на выбранном элементе и выбранном элементе, которые были изменены. Я должен был бы согласиться с Томом, если это так, и предположить, что вы не реализуете его таким образом, поскольку последний элемент никогда не будет выбираться без постепенного удаления фокуса.

Если вы вместо этого хотите сделать ( 2 ), то, по моему опыту, естественным поведением ListBox является переход к следующему элементу управления при нажатии клавиши Tab, и я проверил это для Клавиша со стрелкой вниз, и он работает так же. Когда я добираюсь до последнего элемента в списке, фокус выскакивает из списка и к следующему элементу управления в соответствии с его родителем.

ОБНОВЛЕНИЕ: Я должен отозвать свои исходные комментарии, так как описанное выше поведение не описывает поведение по умолчанию в WPF для ListBox, однако это поведение, которое вы увидите, как я описал выше (которое Я полагаю, это поведение, которое вы ищете) при реализации ItemsControl и указании ItemTemplate. Посмотрите на следующий пример.

<ItemsControl ItemsSource="{Binding ElementName=TheWindow, Path=ListOStrings}">
    <ItemsControl.Template>
        <ControlTemplate TargetType="{x:Type ItemsControl}">
            <Border BorderBrush="Magenta"
                    BorderThickness="1">
                <ScrollViewer>
                    <ItemsPresenter />
                </ScrollViewer>
            </Border>
        </ControlTemplate>
    </ItemsControl.Template>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Случайно, это просто имеет поведение, которое вы описали, так как каждый элемент в списке ведет себя почти как элемент управления, помещенный непосредственно как одноранговый элемент ко всем другим элементам управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...