我在使用WPF RichTextBox
时遇到了一些问题。我创建了一个适用于普通TextBox和RichTextBox的行为。在行为中,我使用了两个事件:
- OnTextChanged
- OnPreviewKeyDown
我假设OnPreviewKeyDown在输入文本时总是在OnTextChanged之前触发。
该行为的工作方式与普通TextBox相同。但是,WPF RichTextBox的PreviewKeyDown和OnTextChanged的事件顺序似乎与普通TextBox的事件顺序不同。 以下代码通过非常快速地键入“as”或甚至同时按下3个键来重现问题:
文本框
class TestTextBox : TextBox
{
protected override void OnTextChanged(TextChangedEventArgs e)
{
base.OnTextChanged(e); // Breakpoint prints "TextChanged!"
}
protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
{
base.OnPreviewKeyDown(e); // Breakpoint prints the pressed key
}
}
Output:
A
TextChanged!
S
TextChanged!
Space
TextChanged!
的RichTextBox:
class TestRichTextBox : RichTextBox
{
protected override void OnTextChanged(TextChangedEventArgs e)
{
base.OnTextChanged(e); // Breakpoint prints "TextChanged!"
}
protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
{
base.OnPreviewKeyDown(e); // Breakpoint prints the pressed key
}
}
Output:
A
S
Space
TextChanged
TextChanged
TextChanged
基本上问题是我的行为假定了普通TextBox的事件顺序。显然,当我对RichTextBox使用相同的行为时会出现问题。
答案 0 :(得分:0)
这两个事件在某种意义上会触发相同的动作流程,所以为什么不使用
protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
{
base.OnPreviewKeyDown(e); // Breakpoint prints the pressed key
}
作为逻辑的起点(因为它总是先触发),并单独留下OnTextChanged?