Я пытаюсь достигнуть эквивалента 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".
Любая справка, достигающая расположения переноса требуемый столбец и навигации клавиши со стрелкой, ценилась бы.
(Редактирования, перемещенные в мой собственный ответ, так как это технически - ответ.)
Оказывается этим, когда это повторяется в моей обработке KeyDown
событие, изменения выбора в корректном объекте, но фокус находятся на старом объекте.
Вот обновленный KeyDown
eventhandler. Из-за Привязки, Items
набор возвращает мои фактические объекты, а не ListBoxItem
s, таким образом, я должен сделать вызов около конца для получения фактического 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();
}
}
}
Необходимо смочь сделать это без использования слушателя события KeyboardNavigation. DirectionalNavigation, например.
<ListBox Name="thelist"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding}"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
KeyboardNavigation.DirectionalNavigation="Cycle">