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

我现在在文本框中获得了一个不错的超链接...除非我单击它,否则什么也不会发生。我在这里想念什么?

有帮助吗?

解决方案

您可以使用 超链接 班级。这是一个FrameworkContentelement,因此您可以在文本框架或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));

另一种方法是使用 指挥 通过设置 命令 超链接上的属性 ICommand 执行。单击超链接时,将在ICommand上执行的方法。

如果您想在处理程序中启动浏览器,则可以将URI传递给 process.start:

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

其他提示

请注意,您还需要在RichTextbox上设置以下属性,否则超链接将被禁用并且不会启动事件。如果没有ISReadonly,您需要单击超链接,然后使用常规的左键单击使用Isreadonly射击。

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

最简单的方法是处理这样的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传递到流程中存在一些问题。开始,您可能希望Google获得更好的方法来实现处理程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top