【问题标题】:RichTextBox Text EventsRichTextBox 文本事件
【发布时间】:2016-12-05 22:06:47
【问题描述】:

尝试使用 WPF RichTextBox 事件进行一些文本操作时,我遇到了一个非常烦人的行为。

这个想法是有一些逻辑,一旦满足某些条件,就会提取 RichTextBox 文本。

问题是TextChanged 事件几乎是完美的,我可以获得我想要的所有文本,但是在TextChanged 上忽略了 Enter 键并且该事件永远不会被触发。

所以PreviewKeyDown 是正确的,对吧?错误的。 PreviewKeyDown 只返回最后一个键被按下之前的文本......而且 KeyDown 也会忽略 Enter 键。此外,KeyUp 也不是一个选项,因为我希望能够阻止某些键被输入。

是否有一个事件可以让我获得 RichTextBox 的整个文本,包括 Enter


编辑:

我正在构建一个 TokenizingRichTextBox 几乎遵循 this tutorial,并进行了一些小的修改(我将它变成了混合行为而不是一种新的控件)。

问题在于用户键入 Enter 时。只有最后一段的文本被添加到新的Token。我想使用 EnterTab (以及其他字符)来触发 Token 创建。但我不能,如前所述,因为 Enter 被忽略了。

此外,虽然这可以通过一些关键事件来解决,但我打算在RichTextBox 中添加某种AutoComplete。使用 AutoComplete 不会触发任何 Key 事件,只会触发 TextChanged,因此考虑到这一点会使事情变得更加复杂。

【问题讨论】:

    标签: c# wpf events


    【解决方案1】:

    TextChanged 事件触发,并且在那个阶段已经将换行符输入到文档中。要更改确切的文本,请执行类似

    的操作
    var doc =  richTextBox.Document;
    foreach(var c in evt.Changes.Where(x => x.AddedLength > 1))
    {
        var change = new TextRange(
            doc.ContentStart.GetPositionAtOffset(c.Offset),
            doc.ContentStart.GetPositionAtOffset(c.Offset + c.AddedLength));
        Debug.WriteLine($"Change: <{change.Text}>");                
    }
    

    【讨论】:

    • 对不起,我忘了提,我希望能够阻止某些键,而KeyUp 没有提供e.Handled = true 来阻止键入键。我会更新我的问题。
    • 我也很抱歉 - 你在谈论 wpf,而我正在测试 winforms :)
    • 我应该更清楚,而不仅仅是 wpf 标签。
    • 据我所知,RichTextBox 在每个Enter 上添加了一个新的Run。问题是将整个文本与它们所在的不同Runs 匹配。我正在构建一个标记化RichTextBox 并将文本与Runs 匹配对于知道在何处匹配新标记内联非常重要。如果我使用你的方法,我确实会得到带有Enter的整个文本,但是稍后将文本与Runs匹配问题会更糟。
    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多