Навигация клавиши со стрелкой ListBox+WrapPanel

Я пытаюсь достигнуть эквивалента WinForms ListView с View набор свойств к View.List. Визуально, следующее хорошо работает. Имена файлов в моем Listbox пойдите сверху донизу и затем перенеситесь к новому столбцу.

Вот основной XAML, с которым я работаю:

<ListBox Name="thelist"
    IsSynchronizedWithCurrentItem="True"
    ItemsSource="{Binding}"
    ScrollViewer.VerticalScrollBarVisibility="Disabled">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True"
                Orientation="Vertical" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

Однако навигация клавиши со стрелкой по умолчанию не переносится. Если последний объект в столбце выбран, нажимание стрелки вниз не переходит к первому объекту следующего столбца.

Я пытался обработать KeyDown событие как это:

private void thelist_KeyDown( object sender, KeyEventArgs e ) {
    if ( object.ReferenceEquals( sender, thelist ) ) {
        if ( e.Key == Key.Down ) {
            e.Handled = true;
            thelist.Items.MoveCurrentToNext();
        }
        if ( e.Key == Key.Up ) {
            e.Handled = true;
            thelist.Items.MoveCurrentToPrevious();
        }
    }
}

Это производит последнее в столбце для first-in-next-column поведения, которое я хотел, но также и произвожу причуду в левой и правой обработке стрелки. Любое время, которое это переносит от одного столбца до следующего/предыдущего использования/стрелки вниз, единственное последующее использование левой или правой клавиши со стрелкой, перемещает выбор налево или направо от объекта, который был выбран непосредственно перед тем, как перенос произошел.

Предположите, что список заполнен строками "0001" до "0100" с 10 строками для каждого столбца. Если я использую клавишу со стрелкой вниз для движения от "0010" до "0011", то нажмите клавишу со стрелкой вправо, выбор перемещается в "0020", только направо от "0010". Если "0011" выбран, и я использую клавишу со стрелкой вверх для перемещения выбора в "0010", то нажатие выбора перемещений клавиш со стрелкой вправо к "0021" (направо от "0011", и нажатие выбора перемещений клавиши со стрелкой влево к "0001".

Любая справка, достигающая расположения переноса требуемый столбец и навигации клавиши со стрелкой, ценилась бы.

(Редактирования, перемещенные в мой собственный ответ, так как это технически - ответ.)

5
задан Joel B Fant 18 December 2009 в 14:47
поделиться

2 ответа

Оказывается этим, когда это повторяется в моей обработке KeyDown событие, изменения выбора в корректном объекте, но фокус находятся на старом объекте.

Вот обновленный KeyDown eventhandler. Из-за Привязки, Items набор возвращает мои фактические объекты, а не ListBoxItems, таким образом, я должен сделать вызов около конца для получения фактического ListBoxItem Я должен звонить Focus() на. Обертывание от последнего объекта до первого и наоборот может быть достигнуто путем свопинга вызовов MoveCurrentToLast() и MoveCurrentToFirst().

private void thelist_KeyDown( object sender, KeyEventArgs e ) {
    if ( object.ReferenceEquals( sender, thelist ) ) {
        if ( thelist.Items.Count > 0 ) {
            switch ( e.Key ) {
                case Key.Down:
                    if ( !thelist.Items.MoveCurrentToNext() ) {
                        thelist.Items.MoveCurrentToLast();
                    }
                    break;

                case Key.Up:
                    if ( !thelist.Items.MoveCurrentToPrevious() ) {
                        thelist.Items.MoveCurrentToFirst();
                    }
                    break;

                default:
                    return;
            }

            e.Handled = true;
            ListBoxItem lbi = (ListBoxItem) thelist.ItemContainerGenerator.ContainerFromItem( thelist.SelectedItem );
            lbi.Focus();
        }
    }
}
8
ответ дан 13 December 2019 в 05:45
поделиться

Необходимо смочь сделать это без использования слушателя события KeyboardNavigation. DirectionalNavigation, например.

<ListBox Name="thelist"
         IsSynchronizedWithCurrentItem="True"
         ItemsSource="{Binding}"
         ScrollViewer.VerticalScrollBarVisibility="Disabled"
         KeyboardNavigation.DirectionalNavigation="Cycle">
4
ответ дан 13 December 2019 в 05:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: