首页 文章

在WPF FlowDocument中的指定位置插入超链接

提问于
浏览
2

我想以编程方式将WPF超链接元素插入到FlowDocument中 .

目标是创建一个工具栏按钮,该按钮将在RichTextBox中运行一系列文本并将其替换为超链接 . 它与您在Web上看到的用于在wiki或博客(或StackOverflow)上创建超链接的界面相同 .

我可以找到所选文本的TextRange,如下所示:

TextRange tr = new TextRange(
    MyRichTextBox.Selection.Start,
    MyRichTextBox.Selection.End);

我试图将Hyperlink Xaml填充到TextRange中,如下所示:

string rawXaml = "<Hyperlink xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" NavigateUri=\"http://www.google.com/\">Google Home Page</Hyperlink>";

    using(MemoryStream stream = new MemoryStream())
    {
        StreamWriter writer = new StreamWriter(stream);
        writer.Write(rawXaml);
        writer.Flush();
        stream.Position = 0;

        if (tr.CanLoad(DataFormats.Xaml))
        {
            tr.Load(stream, DataFormats.Xaml);
        } 
    }

但我似乎仍然将纯文本粘贴到RichTextBox中 .

我在这做错了什么?有没有更好的方法来完成我想要做的事情?

1 回答

  • 5

    使用接收TextPointer的Hyperlink构造函数:

    tr.Text = "";
    Run run = new Run("Google Home Page");
    Hyperlink hlink = new Hyperlink(run, tr.Start);
    hlink.NavigateUri = new Uri("http://www.google.com/");
    

    或者,首先更改文本,然后使用带有两个TextPointers的文本:

    tr.Text = "Google Home Page";
    Hyperlink hlink = new Hyperlink(tr.Start, tr.End);
    hlink.NavigateUri = new Uri("http://www.google.com/");
    

    编辑:如果要使用TextRange.Load,请尝试在 Span 中包装超链接:

    string rawXaml = "<Span xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><Hyperlink NavigateUri=\"http://www.google.com/\">Google Home Page</Hyperlink></Span>";
    

    我不确定为什么这种方法在普通的超链接没有时会起作用,但它更接近TextRange.Save返回的内容 .

相关问题