문제

나는 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();
        }
    }
}

이것은 내가 원했던 최초의 최초의 옥상 컬럼 동작을 생성하지만 왼쪽 및 오른쪽 화살표 처리에서도 이상하게 만듭니다. 위/아래 화살표를 사용하여 한 열에서 다음/이전으로 랩을 할 때마다 왼쪽 또는 오른쪽 화살표 키를 한 번의 후속 사용하면 선택을 랩이 발생하기 직전에 선택한 항목의 왼쪽 또는 오른쪽으로 이동합니다.

목록에 열당 10 개의 문자열이있는 문자열 "0001"~ "0100"으로 채워져 있다고 가정합니다. 아래쪽 화살표 키를 사용하여 "0010"에서 "0011"으로 이동 한 다음 오른쪽 화살표 키를 누르면 선택이 "0010"오른쪽으로 "0020"으로 이동합니다. "0011"이 선택되고 위쪽 화살표 키를 사용하여 선택을 "0010"으로 이동 시키면 오른쪽 화살표 키를 누르면 선택을 "0021"( "0011"의 오른쪽으로, 왼쪽의 누름을 누릅니다. 화살표 키는 선택을 "0001"으로 이동합니다.

원하는 열-랩 레이아웃 및 화살표 키 탐색을 달성하는 데 도움이 될 것입니다.

(기술적으로는 대답이기 때문에 편집이 내 답변으로 이동했습니다.)

도움이 되었습니까?

해결책

내 취급에 감싸면 KeyDown 이벤트, 선택은 올바른 항목으로 변경되지만 초점은 이전 항목에 있습니다.

다음은 업데이트되었습니다 KeyDown 이벤트 핸들러. 바인딩 때문에 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();
        }
    }
}

다른 팁

KeyboardNavigation.DirectionalNavigation, EG를 사용하여 이벤트 청취자없이 수행 할 수 있어야합니다.

<ListBox Name="thelist"
         IsSynchronizedWithCurrentItem="True"
         ItemsSource="{Binding}"
         ScrollViewer.VerticalScrollBarVisibility="Disabled"
         KeyboardNavigation.DirectionalNavigation="Cycle">
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top