FlowDocument:插入超链接并保持格式化

时间:2014-10-19 14:47:38

标签: wpf hyperlink insert formatting flowdocument

如何在特定位置将FlowLink插入FlowDocument?新的HyperLink应具有与周围文本相同的格式 - 除了颜色(应始终为蓝色)和下划线(应始终加下划线)。插入HyperLink后,光标应该在新的HyperLink之后。

我尝试过的事情:

TextPointer caretPosition = richTextBox.CaretPosition;
TextPointer insertPosition = caretPosition.IsAtInsertionPosition ? caretPosition : caretPosition.GetInsertionPosition(LogicalDirection.Forward);
string linkTitle = "Stack Overflow";

Run run = new Run(linkTitle);

Hyperlink link = new Hyperlink(run, insertPosition);
link.IsEnabled = true;
link.NavigateUri = new Uri(@"http://www.stackoverflow.com");

richTextBox.CaretPosition = run.ContentEnd;

这样可行,但新的超链接没有其周围文本的格式。

this.CaretPosition = this.CaretPosition.GetPositionAtOffset(0, LogicalDirection.Forward);
insertPosition.InsertTextInRun(linkTitle);

Hyperlink link = new Hyperlink(insertPosition, insertPosition.GetPositionAtOffset(linkTitle.Length));
link.IsEnabled = true;
link.NavigateUri = new Uri(@"http://www.stackoverflow.com");

TextPointer positionAfterLink = link.ContentEnd.GetPositionAtOffset(1);
if (!positionAfterLink.IsAtInsertionPosition)
    positionAfterLink = caretPosition.GetInsertionPosition(LogicalDirection.Forward);

richTextBox.CaretPosition = positionAfterLink;

这样就保留了格式。但有时候,CaretPosition并未设置在新链接的末尾,而是保留在新链接的前面。此外,它对我来说看起来不太健壮。

有没有人成功地做到了?这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

我会修改您的第一个代码。RichTextBox.Selection是一个TextRange,其中有一个名为GetPropertyValue的方法,可以让您获得一些格式属性,例如FontStyle,{{1 },FontWeight(我认为这就够了)。因此,您可以为新创建的FontSize

设置实现的格式信息
Hyperlink

要使链接具有默认样式(蓝色和带下划线),我们必须将RichTextBox的属性TextPointer caretPosition = richTextBox.CaretPosition; TextPointer insertPosition = caretPosition.IsAtInsertionPosition ? caretPosition : caretPosition.GetInsertionPosition(LogicalDirection.Forward); string linkTitle = "Stack Overflow"; //try getting some format info var fStyle = (FontStyle) richTextBox.Selection .GetPropertyValue(Control.FontStyleProperty); var fWeight =(FontWeight)richTextBox.Selection .GetPropertyValue(Control.FontWeightProperty); var fSize = (double)richTextBox.Selection .GetPropertyValue(Control.FontSizeProperty); //create new link Run run = new Run(linkTitle); Hyperlink link = new Hyperlink(run, insertPosition); link.FontStyle = fStyle; link.FontWeight = fWeight; link.FontSize = fSize; //Remaining code ... 设置为true。插入后,您可能需要在RichTextBox上调用IsDocumentEnabled

相关问题