Перемещение фокуса клавиатуры из ListBox

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

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

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

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

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

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

person Community    schedule 28.03.2009    source источник


Ответы (3)


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

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

person Tom    schedule 28.03.2009

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

  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>

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

person jpierson    schedule 10.02.2011

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

Lst.IsEnabled = False
Lst.MoveFocus(New TraversalRequest(FocusNavigationDirection.Next))
Lst.IsEnabled = True
person Mohammad Hamdy    schedule 23.10.2014