【问题标题】:FlowDocument: Insert Hyperlink and keep formattingFlowDocument:插入超链接并保持格式
【发布时间】:2014-10-19 14:47:37
【问题描述】:

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

我尝试过的事情:

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 不会设置在新链接的末尾,而是停留在新链接的前面。此外,它对我来说看起来不是很健壮。

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

【问题讨论】:

    标签: wpf hyperlink insert formatting flowdocument


    【解决方案1】:

    我会编辑你的第一个代码。RichTextBox.Selection 是一个TextRange,它有一个名为GetPropertyValue 的方法,允许你获取一些格式属性,例如FontStyleFontWeightFontSize(我认为够了)。所以你可以为新创建的Hyperlink设置那些实现的格式信息:

    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 ...
    

    要使链接具有默认样式(蓝色和下划线),我们必须将 RichTextBox 的属性 IsDocumentEnabled 设置为 true。同样在插入之后,您可能需要在 RichTextBox 上调用 Focus()

    【讨论】:

      猜你喜欢
      • 2011-03-29
      • 2018-01-08
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2013-03-08
      • 2017-10-16
      相关资源
      最近更新 更多