我发现自己是一个新的挑战: 使处理程序更像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;
我现在在我的文本框中得到一个很好的超链接...除非我点击它,没有任何反应。 我在这里失踪了什么?
答案 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来启动默认浏览器存在一些问题,您可能希望谷歌更好地实现处理程序。