【问题标题】:C# WPF Text with links带有链接的 C# WPF 文本
【发布时间】:2010-08-05 11:59:02
【问题描述】:

我刚刚发现自己面临新挑战: 制作一个更像网络而不是纯文本的文字处理器。 为此设计一个不错的框架是我迫不及待想开始的,但我确实需要知道 GUI 方面的可能性(它可能会有大量的 GUI 挑战)。

所以我需要某种控制的基本功能,我可以在其中使部分文本可点击/鼠标悬停。

我对 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;

我现在在我的文本框中得到了一个很好的超链接...除了当我点击它时,什么都没有发生。 我在这里错过了什么?

【问题讨论】:

    标签: c# wpf wpf-controls richtextediting


    【解决方案1】:

    您可以使用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));
    

    另一种方法是通过将超链接上的Command 属性设置为ICommand 实现来使用commanding。单击超链接时将调用 ICommand 上的 Executed 方法。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        最简单的方法是像这样处理 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 来启动默认浏览器会出现一些问题,您可能想通过谷歌搜索更好的方法来实现处理程序。

        【讨论】:

          猜你喜欢
          • 2012-09-30
          • 2017-01-07
          • 1970-01-01
          • 2011-08-22
          • 1970-01-01
          • 2015-07-25
          • 2013-11-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多