WPF RichTextBox PreviewKeyDown和OnTextChange事件顺序不同于普通文本框

本文关键字:不同于 文本 顺序 事件 RichTextBox PreviewKeyDown OnTextChange WPF | 更新日期: 2023-09-27 17:54:15

我对WPF RichTextBox有一些问题。我已经创建了一个行为,工作在两个正常的文本框,和RichTextBox。在行为中,我使用两个事件:
- OnTextChanged
——OnPreviewKeyDown

我假设OnPreviewKeyDown在输入文本时总是在OnTextChanged之前触发。

的行为应该像一个普通的文本框。然而,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使用相同的行为时,这会导致问题。

  • 为什么RichTextBox的事件顺序不同地方吗?
  • 普通文本框的事件顺序是否也与文本框的事件顺序不同假定点菜了吗?
  • 我是否可以强制事件顺序,或者在某些情况下达到相同的结果其他方式吗?

WPF RichTextBox PreviewKeyDown和OnTextChange事件顺序不同于普通文本框

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

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

作为你逻辑的起点(因为它总是首先触发),并离开OnTextChanged单独?