2010-08-05 3 views
3

방금 ​​새로운 도전 과제를 발견했습니다. 일반 텍스트보다 웹처럼 처리하는 워드 프로세서를 만드십시오. 이 멋진 프레임 워크를 디자인하는 것은 처음에는 기다릴 수 없지만 GUI 측면에서 가능성이 무엇인지 알아야합니다 (GUI에 많은 어려움이있을 것입니다).C# WPF 링크가있는 텍스트

그래서 내 텍스트의 일부를 클릭/마우스 오버 가능으로 만들 수있는 기본적인 종류의 컨트롤이 필요합니다.

저는 WPF에 다소 익숙하며이를 수행하는 방법이 확실하지 않습니다. 아무도 아이디어를 만들 방법이 있습니까? 예가 있습니까? 이미이 기능이 있습니까? 사전에

감사

편집 :

// Create a FlowDocument to contain content for the RichTextBox. 
FlowDocument myFlowDoc = new FlowDocument(); 

// Add paragraphs to the FlowDocument. 

Hyperlink myLink = new Hyperlink(); 
myLink.Inlines.Add("hyperlink"); 
myLink.NavigateUri = new Uri("http://www.stackoverflow.com"); 

// Create a paragraph and add the Run and hyperlink to it. 
Paragraph myParagraph = new Paragraph(); 
myParagraph.Inlines.Add("check this link out: "); 
myParagraph.Inlines.Add(myLink); 
myFlowDoc.Blocks.Add(myParagraph); 

// Add initial content to the RichTextBox. 
richTextBox1.Document = myFlowDoc; 

내가 지금 내 텍스트 상자에 좋은 하이퍼 링크를 얻을 ... 제외 : 나는하여 RichTextBox 함께 할 수있는 방법을 발견

나는 그것을 클릭, 아무 일도 일어나지 않습니다. 나는 무엇을 여기에서 놓치고 있냐?

답변

16

Hyperlink 클래스를 사용할 수 있습니다. FrameworkContentElement이므로 TextBlock이나 FlowDocument 또는 다른 곳에서는 내용을 포함 할 수 있습니다.

<TextBlock> 
    <Run>Text</Run> 
    <Hyperlink NavigateUri="http://stackoverflow.com">with</Hyperlink> 
    <Run>some</Run> 
    <Hyperlink NavigateUri="http://google.com">hyperlinks</Hyperlink> 
</TextBlock> 

편집기의 일부로 RichTextBox을 사용하는 것이 좋습니다. 그러면 하이퍼 링크와 같은 내용을 포함 할 수있는 FlowDocument가 호스팅됩니다.


업데이트 : 하이퍼 링크의 클릭을 처리하는 방법에는 두 가지가 있습니다. 하나는 RequestNavigate 이벤트를 처리하는 것입니다. 그것은 Routed Event, 그래서 당신은 하이퍼 링크 자체를 핸들러를 첨부 할 수 있습니다 또는 당신은 창 또는를 RichTextBox으로 높은 트리의 요소를 첨부 할 수 있습니다

// On a specific Hyperlink 
myLink.RequestNavigate += 
    new RequestNavigateEventHandler(RequestNavigateHandler); 
// To handle all Hyperlinks in the RichTextBox 
richTextBox1.AddHandler(Hyperlink.RequestNavigateEvent, 
    new RequestNavigateEventHandler(RequestNavigateHandler)); 

다른 방법은 commanding을 사용하는 것입니다 하이퍼 링크의 Command 속성을 ICommand 구현으로 설정합니다. 하이퍼 링크를 클릭하면 ICommand의 Executed 메서드가 호출됩니다. 당신이 핸들러에서 브라우저를 실행하려면

, 당신은 Process.Start에 URI를 전달할 수 있습니다

 

... 
myLink.RequestNavigate += HandleRequestNavigate; 
... 

private void HandleRequestNavigate(object sender, RoutedEventArgs e) 
{ 
    var link = (Hyperlink)sender; 
    var uri = link.NavigateUri.ToString(); 
    Process.Start(uri); 
    e.Handled = true; 
} 
 

있습니다

private void RequestNavigateHandler(object sender, RequestNavigateEventArgs e) 
{ 
    Process.Start(e.Uri.ToString()); 
} 
+0

5 분 내 감사 확인! – SirLenz0rlot

+0

이 트릭을해야합니다, 고마워요! – SirLenz0rlot

1

가장 간단한 방법은 다음과 같이 RequestNavigate 이벤트를 처리하는 것입니다 Process.Start에 url을 전달하여 기본 브라우저를 시작하는 데 몇 가지 문제가 있으며 처리기를 구현하는 더 좋은 방법은 google을 원할 수 있습니다.

3

참고 RichTextBox에서 다음 속성을 설정해야합니다. 그렇지 않으면 하이퍼 링크가 비활성화되고 이벤트가 실행되지 않습니다. IsReadOnly없이 Ctrl 키를 누른 상태에서 하이퍼 링크를 클릭해야합니다. IsReadOnly는 일반 마우스 왼쪽 버튼으로 시작됩니다.

<RichTextBox 
    IsDocumentEnabled="True" 
    IsReadOnly="True"> 
관련 문제