2010-08-15 5 views
2

프로그래밍 방식으로 WPF 하이퍼 링크 요소를 FlowDocument에 삽입하고 싶습니다.WPF FlowDocument의 지정된 위치에 하이퍼 링크 삽입

목표는 RichTextBox 내에서 텍스트를 실행하고 하이퍼 링크로 바꾸는 도구 모음 단추를 만드는 것입니다. 이것은 위키 나 블로그 (또는 StackOverflow)에서 하이퍼 링크를 만들기 위해 웹에서 볼 수있는 것과 같은 종류의 인터페이스입니다.

이 같은 선택한 텍스트의 TextRange 찾을 수 있습니다

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

을 그리고 내가 지금처럼 TextRange에 하이퍼 링크 XAML을 물건을하려고 해요 :

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에 일반 텍스트를 붙여 넣습니다.

내가 뭘 잘못하고 있니? 내가하려는 일을 성취 할 수있는 더 좋은 방법이 있습니까?

답변

5

은 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에서 반환되는 것과 더 가까운 이유가 확실하지 않습니다.

+0

고마워요! 하이퍼 링크 생성자 구문은 문자열 구문 분석보다 훨씬 좋네요. – dthrasher

+0

하이퍼 링크 생성자 주셔서 감사합니다. – Vikram