获取一个WPF RichTextBox在文本上绘制一条水平线

本文关键字:文本 绘制 水平线 一条 RichTextBox WPF 一个 获取 | 更新日期: 2023-09-27 17:53:22

假设我有一个给定的TextRange range,碰巧在它的-----------------中有这个文本(在它自己的行上)

我想在看到该文本时画一条真正的线(而不是仅仅15个破折号)。

但是,我需要在保存它时(以及其他纯文本查看器加载它时)留下破折号。

我发现如何在RichTextBox中绘制一条线:

var line = new Line {X1 = 10, X2 = 200, Y1 = 5, Y2 = 5, 
var paragraph = (Paragraph) MyRichTextBox.Document.Blocks.FirstBlock;
paragraph.Inlines.Add(line);

但是这只是在段落的最后一个内联之后绘制。

那么,我的问题是:

我怎么画,使我的元素没有文本包装(这样我就可以覆盖破折号)?

这是可能的与WPF RichTextBox?

获取一个WPF RichTextBox在文本上绘制一条水平线

可以使用" text装饰品"吗?

TextRange range = new TextRange(RichTextBox.Selection.Start, RichTextBox.Selection.End);
TextDecorationCollection tdc = (TextDecorationCollection)RichTextBox.Selection.GetPropertyValue(Inline.TextDecorationsProperty);
if (!tdc.Equals(TextDecorations.Strikethrough))
{
    tdc = TextDecorations.Strikethrough;
}
range.ApplyPropertyValue(Inline.TextDecorationsProperty, tdc);

我认为您必须从段落中删除Inline并将其替换为Line元素。在这种情况下,您必须在保存时将Line元素替换为"-----"。

    private void FindHRules()
    {
        foreach (Paragraph block in rtf.Document.Blocks.OfType<Paragraph>())
        {
            var inlines = block.Inlines.ToList();
            for(int i = 0; i<inlines.Count; i++)
            {
                var inline = inlines[i];
                TextRange r = new TextRange(inline.ContentStart, inline.ContentEnd);
                if (r.Text.StartsWith("--"))
                {
                    Line l = new Line { Stretch = Stretch.Fill, Stroke = Brushes.DarkBlue, X2 = 1 };
                    block.Inlines.InsertAfter(inline, new InlineUIContainer(l));
                    block.Inlines.Remove(inline);
                }
            }
        }
    }

我用一个RTF文档测试了这一点,该文档在独立段落中有"-----"行(),在其他段落中有换行符()。