gpt4 book ai didi

c# - 使用箭头在 DataGrid WPF 中导航文本框

转载 作者:行者123 更新时间:2023-11-30 16:48:34 28 4
gpt4 key购买 nike

我有一个 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,但是当调用该方法时,什么也没有发生。有任何想法吗?提前致谢!

最佳答案

万一其他人遇到它,问题就出在事件上。 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;
}
}

关于c# - 使用箭头在 DataGrid WPF 中导航文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37942414/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com