2010-08-15 5 views
2

Je souhaite insérer un élément de lien hypertexte WPF dans un FlowDocument par programmation.Insérer un lien hypertexte à une position spécifiée dans un FlowFocument WPF

L'objectif est de créer un bouton de barre d'outils qui prendrait une série de texte dans un RichTextBox et le remplacerait par un lien hypertexte. C'est le même type d'interface que vous voyez sur le Web pour créer des hyperliens sur des wikis ou sur des blogs (ou sur StackOverflow).

je peux trouver la TextRange du texte sélectionné comme ceci:

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

Et je tente de farcir Hyperlink Xaml dans la TextRange comme ceci:

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); 
     } 
    } 

Mais il me semble encore pour obtenir du texte brut collé dans le RichTextBox.

Qu'est-ce que je fais mal ici? Y a-t-il de meilleurs moyens d'accomplir ce que j'essaie de faire?

Répondre

5

Utilisez le constructeur pour Hyperlink qui prend dans un 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/"); 

Ou, modifiez le texte, puis utilisez celui qui prend deux TextPointers:

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

Edit: Si vous souhaitez utiliser TextRange.Load, essayez d'envelopper le lien hypertexte dans une plage:

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

Je ne sais pas pourquoi cela fonctionne quand un simple lien hypertexte ne fonctionne pas, mais il est plus proche de ce qui est renvoyé par TextRange.Save.

+0

Merci! Cette syntaxe de constructeur de lien hypertexte est beaucoup plus agréable que l'analyse de chaîne de toute façon. – dthrasher

+0

Merci pour le constructeur de lien hypertexte – Vikram

Questions connexes