1

假设我有一个给定的 TextRangerange恰好有这个文本-----------------(在它自己的行上。)

每当我看到该文本时,我都想画一条实线(而不是只有 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);

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

所以,我的问题是:

如何绘制,以便我的 UIElement 没有文字环绕(以便我可以覆盖破折号)?

WPF RichTextBox 可以做到这一点吗?

4

2 回答 2

0

我认为你必须从段落中删除并用一个元素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 文档对此进行了测试,该文档在独立段落 (<enter>) 中具有“-----”行,在其他段落中具有换行符 (<shift-enter>)。

于 2013-01-21T20:12:07.203 回答
0

您能否为此使用“TextDecorations.Strikethrough”。

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);
于 2013-01-16T03:07:52.597 回答