8

我刚刚发现自己面临一个新挑战:制作一个更像网络而不是纯文本的文字处理器。为此设计一个好的框架是我迫不及待想开始的,但我确实需要知道 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;

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

4

3 回答 3

25

您可以使用超链接类。它是一个 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事件。它是一个路由事件,因此您可以将处理程序附加到超链接本身,也可以将处理程序附加到树中较高的元素,例如窗口或 RichTextBox:

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

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

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

private void RequestNavigateHandler(object sender, RequestNavigateEventArgs e)
{
    Process.Start(e.Uri.ToString());
}
于 2010-08-05T12:13:06.707 回答
4

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

<RichTextBox
    IsDocumentEnabled="True"
    IsReadOnly="True">
于 2013-10-03T19:12:40.440 回答
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 来启动默认浏览器存在一些问题,您可能想通过谷歌搜索更好的方法来实现处理程序。

于 2010-08-05T14:48:15.187 回答