我在每个单元格中创建了一个带有可编辑文本块的自定义网格控件。编辑是通过双击触发的,如下所示:
void TextBlock_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.ClickCount == 2) Edit();
}
public void Edit()
{
TextBox.Text = TextBlock.Text;
TextBlock.Visibility = System.Windows.Visibility.Collapsed;
TextBox.Visibility = System.Windows.Visibility.Visible;
Dispatcher.BeginInvoke((ThreadStart)delegate
{
TextBox.Focus();
TextBox.SelectAll();
});
}
这部分按预期工作。
我想让用户能够通过按标签前进或移动标签返回来切换到下一个单元格。我添加了一个触发事件,如下所示:
void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Tab)
{
e.Handled = true;
OnTab(System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.LeftShift) || System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.RightShift));
}
}
Edit()
外部网格处理此事件并在下一个或上一个可编辑单元格上调用该方法。只要我实际上没有在文本框中输入,这几乎可以按预期工作。出于某种原因,如果我输入了任何内容,则 LostFocus 事件不仅会针对当前单元格(在Edit()
调用Focus()
文本框后预期)而且还会针对下一个单元格触发。这是 LostFocus 事件的代码。(虽然我很确定这不相关。)
void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
bool TextChanged = TextBox.Text != TextBlock.Text;
TextBlock.Text = TextBox.Text;
TextBlock.Visibility = System.Windows.Visibility.Visible;
TextBox.Visibility = System.Windows.Visibility.Collapsed;
if (TextChanged) OnTextChanged();
}
我可以创建某种奇特的门来让文本框忽略此事件,但我更好奇它为什么会触发,或者至少我如何才能找到答案。
谢谢。
编辑:
所以很明显,即使有一些门控,我仍然很兴奋。我添加了一个名为的布尔值Editing
并更改了该Edit()
方法以使其像这样工作:
public void Edit()
{
TextBox.Text = TextBlock.Text;
TextBlock.Visibility = System.Windows.Visibility.Collapsed;
TextBox.Visibility = System.Windows.Visibility.Visible;
Thread Task = new Thread(() =>
{
Editing = true;
Dispatcher.BeginInvoke((ThreadStart)delegate
{
System.Windows.Input.Keyboard.Focus(TextBox);
TextBox.SelectAll();
EditGate.Set();
});
EditGate.WaitOne();
Editing = false;
});
Task.Start();
}
然后更改了 LostFocus 处理程序:
void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
if (Editing) return;
// ... Some more code.
}
不幸的是,这也不起作用。事情最终是这样的:
- 当前单元格:编辑开始为假
- 当前单元格:Tab 事件触发
- 下一个单元格:调用 Edit()
- 下一个单元格:编辑设置为 True
- 下一个单元格:调用 EditGate.WaitOne()
- 下一个单元格:Keyboard.Focus() 调用
- 当前单元格:焦点丢失(编辑仍然是错误的)
- 下一个单元格:Textbox.SelectAll() 调用
- 下一个单元格:调用 EditGate.Set()
- 下一个单元格:编辑设置为 False
- 下一个单元格:失去焦点(编辑现在是错误的)
我不确定为什么 LostFocus 事件会在其他所有事件之后触发。它几乎就像它知道我要做什么一样。:P