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
),你真的别无选择,只能处理一个键恐怕还有鼠标事件。
但这应该是一件很容易实现的事情。例如,您可以处理 ListView
的 PreviewKeyDown
事件和 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":)
我有一个 WPF 桌面应用程序,其中的 ListView 包含一些项目。
我希望在用鼠标单击某个项目时,或者在使用键盘选择它并且用户单击 "Enter" 时收到通知。 所需的行为类似于 "Settings" 在现代 Windows 10 UI) 上的行为,或类似于右侧
上的项目的行为SelectionChanged 对我不起作用,因为当用户使用键盘导航时,我只想在他们单击 "Enter" 时执行操作。
有标准的方法吗?我可以捕获 keys/mouse 事件,但这似乎是一个可疑的解决方案。
Is there a standard way of doing that?
没有。您描述的不是标准行为。
由于ListView
中的一个项目实际上是在你按下键盘上的上下键时被选中的(而不是按ENTER
),你真的别无选择,只能处理一个键恐怕还有鼠标事件。
但这应该是一件很容易实现的事情。例如,您可以处理 ListView
的 PreviewKeyDown
事件和 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":)