Вставьте гиперссылку в указанной позиции в FlowFocument WPF - PullRequest
2 голосов
/ 15 августа 2010

Я бы хотел вставить элемент гиперссылки WPF в FlowDocument программным способом.

Цель состоит в том, чтобы создать кнопку на панели инструментов, которая будет выполнять прогон текста в RichTextBox и заменять его гиперссылкой.Это тот же интерфейс, который вы видите в Интернете для создания гиперссылок в вики или блогах (или в StackOverflow).

Я могу найти TextRange выделенного текста следующим образом:

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

И я пытаюсь вставить Гиперссылку 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 голосов
/ 15 августа 2010

Используйте конструктор для гиперссылки, который принимает TextPointer:

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, попробуйте обернуть гиперссылку в диапазон:

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.

...