我找不到在 WPF ListView 中以编程方式设置焦点项目的方法。我只能找到 Selected Item | 的变体 项目 | 索引 | 值,但 'Focused' 项目与 'selected' 项目没有直接关系 - 可以不选择焦点项目(例如,当使用 Ctrl+Click 取消选择当前项目时)。
简而言之-我想从下面提供的代码中获得以下行为(它用虚拟的 8 个项目填充虚拟列表视图,并在按下 X 时尝试从末尾开始关注第二个项目):
想要的行为:
- 使用鼠标 - 选择第二个项目
- 按 X - 这会从最后开始关注第二个项目
- 按键盘上的“向下”数组 - 这应该将当前选择移动到最后一项
实际发生了什么:
- 使用鼠标 - 选择第二个项目
- 按 X - 这会从最后选择第二个项目,但焦点仍然在从开始的第二个项目上
- 按键盘上的“向下”数组 - 这应该将当前选择移动到最后一项,但选择的是第三项。
注意:普通的 Win32 API(当然,与 WPF 完全不同)有 LVM_SETSELECTIONMARK 消息。我在 WPF 中找不到类似的东西。它存在吗?
示例 XAML:
<Window x:Class="WpfListviewTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="350" Width="525">
<ListView x:Name="List1" KeyDown="List1_KeyDown">
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Column 1" />
<GridViewColumn Width="140" Header="Column 2" />
<GridViewColumn Width="140" Header="Column 3" />
</GridView>
</ListView.View>
<sys:DateTime>1/2/3</sys:DateTime>
<sys:DateTime>4/5/6</sys:DateTime>
<sys:DateTime>7/8/9</sys:DateTime>
<sys:DateTime>10/11/12</sys:DateTime>
<sys:DateTime>1/2/3</sys:DateTime>
<sys:DateTime>4/5/6</sys:DateTime>
<sys:DateTime>7/8/9</sys:DateTime>
<sys:DateTime>10/11/12</sys:DateTime>
</ListView>
</Window>
示例代码隐藏:
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private void List1_KeyDown(object sender, KeyEventArgs e) {
if( e.Key == Key.X ) {
List1.SelectionMode = SelectionMode.Single;
List1.SelectedIndex = List1.Items.Count - 2;
}
}
}