我有一个DataGrid,它使用DataGridTextColumns来显示一些数据,其中一些我希望能够更改。一切都很好,除了使用箭头导航它。如果我选择一个单元格并使用箭头移动,一切正常,但我想对TextBoxCell做同样的事情。 我所拥有和工作的是使用VisualTreeHelper浏览可视化树并获取下一个单元格并选择TextBox;但是,鉴于我必须分别处理每个密钥,这是非常非常长的代码。鉴于细胞已经以这种方式处理事件,我尝试了这个:
private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) {
TextBox tb = sender as TextBox;
var temp = VisualTreeHelper.GetParent(tb);
var cell = temp as DataGridCell;
while (cell == null) {
temp = VisualTreeHelper.GetParent(temp);
cell = temp as DataGridCell;
}
if (tb == null)
return;
cell.RaiseEvent(e);
}
但每当我使用钥匙时,都没有任何反应。事件刚刚被跳过。代码一直运行到RaiseEvent,但是当调用该方法时,没有任何反应。 有任何想法吗? 提前谢谢!
答案 0 :(得分:2)
如果其他人遇到它,问题就是事件。 DataGridCell不处理PreviewKeyDown,只处理KeyDown。解决方案是手动创建事件并将其发送到单元格。考虑到如果你未能将事件处理掉,它将触发两次。完整的代码如下;
private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) {
TextBox tb = sender as TextBox;
if (tb != null && isControlKey(e.Key)) {
var temp = VisualTreeHelper.GetParent(tb);
var cell= temp as DataGridCell;
while (cell== null) {
temp = VisualTreeHelper.GetParent(temp);
cell = temp as DataGridCell;
}
if (tb == null || cell== null)
return;
var target = cell;
var routedEvent = Keyboard.KeyDownEvent;
if (tb.Text.Trim().Length == 0) //Just a check for the value
tb.Text = "0";
cell.RaiseEvent(
new KeyEventArgs(Keyboard.PrimaryDevice, PresentationSource.FromVisual(cell), 0, e.Key) {
RoutedEvent = routedEvent
});
e.Handled = true;
}
}