带链接的C#WPF文本

时间:2010-08-05 11:59:02

标签: c# wpf wpf-controls richtextediting

我发现自己是一个新的挑战: 使处理程序更像Web,而不是纯文本。 为此设计一个很好的框架是我不能等待的开始,但我确实需要知道GUI端的可能性(它可能会有很多GUI挑战)。

所以基本的东西我需要某种控制,我可以使我的部分文字可点击/鼠标覆盖。

我是WPF的新手,不知道如何做到这一点。 有谁知道如何制作这个? 有例子吗? 对此有控制吗?

提前致谢

编辑:

我发现了一些使用richtextbox的方法:

// 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;

我现在在我的文本框中得到一个很好的超链接...除非我点击它,没有任何反应。 我在这里失踪了什么?

3 个答案:

答案 0 :(得分:21)

您可以使用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,因此您可以将处理程序附加到超链接本身,也可以将其附加到树中较高的元素,例如Window或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方法。

如果要在处理程序中启动浏览器,可以将URI传递给Process.Start

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

答案 1 :(得分:3)

请注意,您还需要在RichTextBox上设置以下属性,否则将禁用超链接,并且不会触发事件。如果没有IsReadOnly,您需要按住Ctrl键单击超链接,使用IsReadOnly可以通过常规左键单击它们。

<RichTextBox
    IsDocumentEnabled="True"
    IsReadOnly="True">

答案 2 :(得分:1)

最简单的方法是处理RequestNavigate事件,如下所示:


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

通过将url传递给Process.Start来启动默认浏览器存在一些问题,您可能希望谷歌更好地实现处理程序。