如何获取FlowDocument超链接以启动浏览器并转到WPF应用程序中的URL?

WPF应用程序中的以下代码创建一个超链接,其外观和行为类似于超链接,但在单击时不执行任何操作。

我需要更改什么,以便当我单击它时,它会打开默认浏览器并转到指定的URL?

替代文字http://www.deviantsart.com/upload/4fbnq2.png

XAML:

     

代码背后:

 using System; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; namespace TestLink238492 { public partial class Window1 : Window { public Window1() { InitializeComponent(); FlowDocumentScrollViewer fdsv = new FlowDocumentScrollViewer(); FlowDocument doc = new FlowDocument(); fdsv.Document = doc; fdsv.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden; doc.PagePadding = new Thickness(0); Paragraph paragraph = new Paragraph(); doc.Blocks.Add(paragraph); Run run = new Run("this is flow document text and "); paragraph.Inlines.Add(run); Run run2 = new Run("this is a hyperlink"); Hyperlink hlink = new Hyperlink(run2); hlink.NavigateUri = new Uri("http://www.google.com"); paragraph.Inlines.Add(hlink); StackPanel sp = new StackPanel(); TextBlock tb = new TextBlock(); tb.Text = "this is textblock text"; sp.Children.Add(tb); sp.Children.Add(fdsv); MainArea.Content = sp; } } } 

我找到了这个答案,你必须自己添加RequestNavigate自行处理:

 Run run2 = new Run("this is a hyperlink"); Hyperlink hlink = new Hyperlink(run2); hlink.NavigateUri = new Uri("http://www.google.com"); hlink.RequestNavigate += new System.Windows.Navigation.RequestNavigateEventHandler(hlink_RequestNavigate); paragraph.Inlines.Add(hlink); void hlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e) { Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri)); e.Handled = true; } 

得到了这个Poma的解决方案。 下面的代码部分应该添加到您需要执行此操作的类中。 或者你可以把它放在某个地方的静态类中,如果你需要从多个文件中获取它。 我已经稍微调整了一下我正在做的事情。

  #region Activate Hyperlinks in the Rich Text box //http://stackoverflow.com/questions/5465667/handle-all-hyperlinks-mouseenter-event-in-a-loaded-loose-flowdocument void SubscribeToAllHyperlinks(FlowDocument flowDocument) { var hyperlinks = GetVisuals(flowDocument).OfType(); foreach (var link in hyperlinks) link.RequestNavigate += new System.Windows.Navigation.RequestNavigateEventHandler(link_RequestNavigate); } public static IEnumerable GetVisuals(DependencyObject root) { foreach (var child in LogicalTreeHelper.GetChildren(root).OfType()) { yield return child; foreach (var descendants in GetVisuals(child)) yield return descendants; } } void link_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e) { //http://stackoverflow.com/questions/2288999/how-can-i-get-a-flowdocument-hyperlink-to-launch-browser-and-go-to-url-in-a-wpf Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri)); e.Handled = true; } #endregion Activate Hyperlinks in the Rich Text box 

你会在你的代码中这样称呼它:

  string xaml = HTMLConverter.HtmlToXamlConverter.ConvertHtmlToXaml(this.itemControl.NotificationItem.Body, true); FlowDocument flowDocument = XamlReader.Load(new XmlTextReader(new StringReader(xaml))) as FlowDocument; SubscribeToAllHyperlinks(flowDocument); bodyFlowDocument.Document = flowDocument; 

所有HTMLConverter的东西都可以在以下url找到: http : //blogs.msdn.com/b/wpfsdk/archive/2006/05/25/606317.aspx那就是你需要将HTML转换为流文档。 虽然,这略微超出了本主题的范围。