【问题标题】:WPF RichTextBox PreviewKeyDown and OnTextChange event order differs from normal TextBoxWPF RichTextBox PreviewKeyDown 和 OnTextChange 事件顺序与普通 TextBox 不同
【发布时间】: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 起作用(至少我没有其他情况表明)
  • 你想对这些事件做什么?如果您试图阻止更改或修改输入的内容,您可能应该只使用TextChangedEventArgsChanges 属性。这也适用于粘贴和绑定。见this answer

标签: c# wpf richtextbox textchanged


【解决方案1】:

这两个事件在某种意义上触发了相同的动作流,所以为什么不使用

protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
{
    base.OnPreviewKeyDown(e); // Breakpoint prints the pressed key
}

作为您逻辑的起点(因为它总是首先触发),然后单独保留 OnTextChanged?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多