【发布时间】:2014-05-07 14:32:27
【问题描述】:
我在使用 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!
富文本框:
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
基本上问题是我的行为假定了普通文本框的事件顺序。显然,当我对 RichTextBox 使用相同的行为时,这会导致问题。
- 为什么第一个 RichTextBox 的事件顺序不同 地点?
- 普通 TextBox 的事件顺序是否也与 假设顺序?
- 我能否以某种方式强制事件顺序,或在某些情况下达到相同的结果 其他方式?
【问题讨论】:
-
会不会是因为
RichTextBox的流文档功能,即格式化和分页?而TextBox只有简单的显示功能。因此,TextBox的事件正常触发,而RichTextBox需要执行一些操作并在内部进行检查。 -
OnPreviewKeyDown仍然在OnTextChanged正确之前触发。是的,如果您有 N 键翻转键盘并且您发送垃圾键,则在处理每个 textchanged 之前注册多个 keydown。但是我不确定我在哪里看到 TextChanged 在相应的 KeyDown 事件之前被触发。或者你的意思是你的问题是在另一个keydown之前立即获得一个keydown,然后是一个TextChanged? -
是的,我希望每个 PreviewKeyDown 事件调用都在另一个 PreviewKeyDown 之前跟随 TextChanged 事件。它似乎对普通的 TextBox 起作用(至少我没有其他情况表明)
-
你想对这些事件做什么?如果您试图阻止更改或修改输入的内容,您可能应该只使用
TextChangedEventArgs的Changes属性。这也适用于粘贴和绑定。见this answer。
标签: c# wpf richtextbox textchanged