C# 获取WPF RichTextBox以在文本上绘制水平线
假设我有一个给定的TextRange范围,它恰好有这个文本在它自己的行上 每当我看到文本时,我想画一条真正的线,而不是仅仅画15个破折号 但是,我需要将破折号保留在那里,以备保存和其他纯文本查看器加载时使用 我发现了如何在RichTextBox中画一条线:C# 获取WPF RichTextBox以在文本上绘制水平线,c#,.net,wpf,richtextbox,C#,.net,Wpf,Richtextbox,假设我有一个给定的TextRange范围,它恰好有这个文本在它自己的行上 每当我看到文本时,我想画一条真正的线,而不是仅仅画15个破折号 但是,我需要将破折号保留在那里,以备保存和其他纯文本查看器加载时使用 我发现了如何在RichTextBox中画一条线: var line = new Line {X1 = 10, X2 = 200, Y1 = 5, Y2 = 5, var paragraph = (Paragraph) MyRichTextBox.Document.Blocks.FirstB
var line = new Line {X1 = 10, X2 = 200, Y1 = 5, Y2 = 5,
var paragraph = (Paragraph) MyRichTextBox.Document.Blocks.FirstBlock;
paragraph.Inlines.Add(line);
但这只是在段落最后一行之后绘制
所以,我的问题是:
我如何绘制,使我的UIElement没有文字换行,以便覆盖虚线
WPF RichTextBox是否可以这样做?是否可以使用文本装饰。删除线
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);
我认为您必须删除段落中的内联,并用Line元素替换它。在这种情况下,您必须将行元素替换为--on save
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文档对此进行了测试,该文档在独立段落中有---行,在其他段落中有换行符。不幸的是,删除线看起来不像一行。只是一条虚线,有人用它来连接这些点。