【问题标题】:WPF RichTextBox seems to add in hidden paddingWPF RichTextBox 似乎添加了隐藏的填充
【发布时间】:2013-07-03 02:30:49
【问题描述】:

这让我发疯了。我正在写一个文本荧光笔,它最终调用了代码:

TextPointer caret = textBox.CaretPosition;
TextPointer contentStart = textBox.Document.ContentStart;

TextPointer highlightStart = contentStart.GetPositionAtOffset(startPosition + 1, LogicalDirection.Forward);
TextPointer highlightEnd = contentStart.GetPositionAtOffset(endPosition + 2, LogicalDirection.Forward);

textBox.Selection.Select(highlightStart, highlightEnd);
textBox.Selection.ApplyPropertyValue(textElementProperty, value);
textBox.Selection.Select(caret, caret);

textBox.CaretPosition = caret;

实际代码本身可以正常工作......一次。问题是,一旦它突出显示,就像RichTextBox 在我的突出显示周围添加隐藏的填充,这样当我在文本上运行Regex 时,Regex 返回正确的偏移量,但它没有正确映射到RichTextBox 中的正确字母。例如,如果我要突出显示“狐狸”这个词,如下所示:

敏捷的棕色狐狸跳过了懒狗。

“狐狸”这个词会正确突出显示,但如果我将“狗”改为狐狸,它会显示如下:

敏捷的棕色狐狸跳过懒惰的y fo牛。

然而,删除第一个“狐狸”会更正后一个版本,使其变为:

快速的棕色狗跳过懒惰的狐狸

这几乎就像RichTextBox 添加了一些我在进行文本扫描时无法解释的填充。

更新

我找到了解决问题的方法。但是,这似乎只是进一步证实了我的猜想。如果我反向应用着色,这似乎可以解决它,如:

protected override void TextChanged(TextChangedEventArgs args) {
    var matches = regex.Matches(base.Text)
        .Cast<Match>()
        .Select(match => new {
            Start = match.Index,
            End = match.Index + match.Length
        }).Reverse();

    foreach (var match in matches) {
        Colorize(match.Start, match.End, TextElement.ForegroundProperty, Brushes.Blue);
    }

}

看来我不应该这样做。真的看起来像是在添加填充或其他东西。

【问题讨论】:

    标签: c# wpf richtextbox


    【解决方案1】:

    TextPointer API 不仅计算字符,还计算 符号,其中可以包括开始和结束标记等。请参阅 MSDN 上的备注部分,了解什么是符号 http://msdn.microsoft.com/en-us/library/ms598662.aspx

    因此,当您添加一些格式时,它会丢弃您稍后在文本中保存的符号偏移量。您必须从那里再次应用格式搜索等。或者反过来也可以。

    【讨论】:

    • 我想了一会儿,似乎最好的方法是一次获取所有位置标记,然后一次应用所有突出显示以避开所有填充/移位。感谢您的帮助。
    • 你可能想看看 TextRange 的东西 link。从内存中,如果您设置一个 myTextRange = TextRange(textPointer1, textPointer2) 它将保持其在面对编辑时的相对位置。您可以使用 myTextRange.ApplyPropertyValue(...) 对其应用样式
    • 是的,这实际上就是我所做的。我预先计算所有TextPointer/TextRange 位置,然后再应用更改。尽管RichTextBox 速度非常慢,但我还是很想手动重写我需要的功能。
    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2019-02-13
    • 2016-12-05
    • 2016-04-12
    • 2012-08-14
    相关资源
    最近更新 更多