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

Разработвам програма в WPF (VB), която разчита само на навигация от клавиатурата.

В моята програма имам списъчно поле, което показва до 20 000 елемента.

Това, което искам е, че когато списъчното поле има фокус на клавиатурата и аз се преместя до най-долния елемент, който е видим (с помощта на стрелка надолу), искам фокусът да се премести към следващия елемент извън списъчното поле. Използвам 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

Използвам лесен трик, за да преместя фокуса извън списъка: деактивирам списъка, така че фокусът да се премести автоматично към следващата контрола, след което активирам списъка отново :)

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