我正在使用DataGrid来显示一堆数据。我有SelectionMode="Extended"
和SelectionUnit="FullRow"
。
我想要做的是按下J
将焦点在网格中向下移动,按下K
以在网格中向上移动,然后按下x
将焦点行添加到列表中/从列表中删除SelectedItems
(基本上就像 gmail键盘快捷键)
我对 wpf 非常方便,但我还没有能够做到这一点。我不确定行焦点是否与所选项目分开,但我知道到底是什么,也许这里有人做过类似的事情。
这是我到目前为止尝试过的
case Key.X:
{
resultsGrid.SelectedItems.Add(resultsGrid.SelectedItem);
e.Handled = true;
break;
}
case Key.J:
{
//down
var currow = (DataGridRow) resultsGrid.ItemContainerGenerator.ContainerFromItem(resultsGrid.SelectedItem);
currow.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
//if (resultsGrid.SelectedIndex + 1 >= resultsGrid.Items.Count)
// resultsGrid.SelectedIndex = 0;
//else
// resultsGrid.SelectedIndex++;
break;
}
case Key.K:
{
//up
var currow =
(DataGridRow) resultsGrid.ItemContainerGenerator.ContainerFromItem(resultsGrid.SelectedItem);
currow.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));
//if (resultsGrid.SelectedIndex - 1 <= 0)
// resultsGrid.SelectedIndex = resultsGrid.Items.Count - 1;
//else
// resultsGrid.SelectedIndex--;
break;
}
当前,当前行不会向上或向下移动。我也试过了FocusNavigationDirection.Previous
,Next
那些也没有移动焦点。如果我按索引移动,它会移动,但按 X 不会添加到选定项目列表中。在您使用 shift 和 up/down 或 shift 鼠标单击之前,似乎不想启动多选
编辑
好的,所以我已经弄清楚如何使用j
andk
键进行导航,但是选择仍然不起作用。如果我向上或向下移动它会清除选择,x
至少在视觉上按下也不会做任何事情。
case Key.X:
resultsGrid.SelectedItems.Add(resultsGrid.SelectedItem);
e.Handled = true;
break;
case Key.J:
{
//down
InputManager.Current.ProcessInput(new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Down)
{
RoutedEvent = Keyboard.KeyDownEvent
});
resultsGrid.ScrollIntoView(resultsGrid.SelectedItem);
e.Handled = true;
break;
}
case Key.K:
{
//up
InputManager.Current.ProcessInput(new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Up)
{
RoutedEvent = Keyboard.KeyDownEvent
});
resultsGrid.ScrollIntoView(resultsGrid.SelectedItem);
e.Handled = true;
break;
}