WPF RichTextBox PreviewKeyDown和OnTextChange事件顺序与普通TextBox不同

时间:2014-03-28 08:27:39

标签: c# wpf richtextbox textchanged

我在使用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使用相同的行为时会出现问题。

  • 为什么第一个中的RichTextBox的事件顺序不同 放置?
  • 普通TextBox的事件顺序是否也可以与 假设订单?
  • 我可以以某种方式强制事件顺序,或在某些情况下达到相同的结果 其他方式?

1 个答案:

答案 0 :(得分:0)

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

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

作为逻辑的起点(因为它总是先触发),并单独留下OnTextChanged?