WPF:使用键盘导航和选择 ListView 项目

WPF: Navigating and selecting a ListView item with keyboard

我有一个 WPF 桌面应用程序,其中的 ListView 包含一些项目。

我希望在用鼠标单击某个项目时,或者在使用键盘选择它并且用户单击 "Enter" 时收到通知。 所需的行为类似于 "Settings" 在现代 Windows 10 UI) 上的行为,或类似于右侧

上的项目的行为

SelectionChanged 对我不起作用,因为当用户使用键盘导航时,我只想在他们单击 "Enter" 时执行操作。

有标准的方法吗?我可以捕获 keys/mouse 事件,但这似乎是一个可疑的解决方案。

Is there a standard way of doing that?

没有。您描述的不是标准行为。

由于ListView中的一个项目实际上是在你按下键盘上的上下键时被选中的(而不是按ENTER),你真的别无选择,只能处理一个键恐怕还有鼠标事件。

但这应该是一件很容易实现的事情。例如,您可以处理 ListViewPreviewKeyDown 事件和 ListViewItem 容器的 PreviewMouseLeftButtonDown 事件。

请参考下面的示例代码

<ListView x:Name="lv" PreviewKeyDown="lv_PreviewKeyDown">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="lv_PreviewMouseLeftButtonDown" />
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

public MainWindow()
{
    InitializeComponent();
    lv.ItemsSource = new List<string> { "1", "2", "3" };
}

private void lv_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show((sender as ListViewItem).DataContext.ToString());
}

private void lv_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        MessageBox.Show(lv.SelectedItem.ToString());
    }
}

实现一些自定义行为不是"fishy":)