如何使用 NumPad 在 WPF C# 中导航列表视图

How to Use NumPad to navigate list view in WPF C#

我正在创建一个 WPF 应用程序,列表视图将从数据库中加载一些订单。由于某些情况,实际使用此应用程序时只能使用 NumPad 键盘。但是,我一直在互联网上搜索,但无法正常工作。

我想做的是使用 NumPad8 和 NumPad2 上下导航列表项。就像普通键盘上的箭头键一样。并在加载列表时将焦点设置在第一项上。

我使用的是MVVM风格,但是如果代码需要放在代码后面也可以。

这是我的 XAML 代码:

<ListView Name="PreparingView" ItemContainerStyle="{StaticResource CenterAlignmentStyle}" Background="Lavender" FontSize="25" Width="450" FontWeight="Bold" ItemsSource="{Binding PreparingList}" 
              HorizontalAlignment="Left" HorizontalContentAlignment="Left" Foreground="Blue" SelectedValue="{Binding CurrentSelection, Mode=TwoWay}" Margin="10,80,0,180">
        <ListView.View>
            <GridView ColumnHeaderContainerStyle="{StaticResource noHeaderStyle}">
                <GridViewColumn Width="Auto" DisplayMemberBinding="{Binding QNum}"/>
            </GridView>
        </ListView.View>
    </ListView>

如果有人能提供帮助,我将不胜感激。谢谢。

这应该可以满足您的要求:

示例XAML:

<Window x:Class="WpfApp14.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp14"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
    <Grid>
        <ListView Name="lvTest" KeyDown="lvTest_KeyDown">
            <ListView.Items>
                <ListViewItem>item 1</ListViewItem>
                <ListViewItem>item 2</ListViewItem>
                <ListViewItem>item 3</ListViewItem>
                <ListViewItem>item 4</ListViewItem>
                <ListViewItem>item 5</ListViewItem>
                <ListViewItem>item 6</ListViewItem>
                <ListViewItem>item7</ListViewItem>
                <ListViewItem>item 8</ListViewItem>
            </ListView.Items>
        </ListView>
    </Grid>
</Window>

隐藏代码:

private void lvTest_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.NumPad2)
    {
        if (lvTest.SelectedIndex < lvTest.Items.Count -1)
        {
            lvTest.SelectedIndex++;
        }
        else
        {
            lvTest.SelectedIndex = 0;
        }
    }
    else if (e.Key == Key.NumPad8)
    {
        if (lvTest.SelectedIndex > 0)
        {
            lvTest.SelectedIndex--;
        }
        else
        {
            lvTest.SelectedIndex = lvTest.Items.Count - 1;
        }
    }
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    lvTest.Focus();
    lvTest.SelectedIndex = 0;
}