2010-02-18 14 views
11

Poniższy kod w aplikacji WPF tworzy hiperłącze, które wygląda i aktów jak hiperłącza, ale nie zrobić niczego po kliknięciu.Jak uzyskać hiperłącze FlowDocument do uruchomienia przeglądarki i przejść do adresu URL w aplikacji WPF?

Co muszę zmienić, aby po kliknięciu otworzyła domyślną przeglądarkę i przechodzi pod wskazany adres URL?

alt text http://www.deviantsart.com/upload/4fbnq2.png

XAML:

<Window x:Class="TestLink238492.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel Margin="10"> 
     <ContentControl x:Name="MainArea"/> 
    </StackPanel> 
</Window> 

Code Behind:

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; 
     } 
    } 
} 
+0

Zobacz także późniejszy http://stackoverflow.com/questions/10238694/example-using-hyperlink-in-wpf - te dwa pytania powinny być połączone, ale nie jestem pewien, czy są one prawdziwymi duplikatami. –

Odpowiedz

16

znalazłem odpowiedź na to jedno, trzeba dodać RequestNavigate i han sami sami:

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; 
} 
+0

Powinieneś oznaczyć to jako odpowiedź. Działa świetnie :) –

+1

A co jeśli załaduję dokument z RTF? – Poma

7

Mam rozwiązania dla tego Poma. Poniższą sekcję kodu należy dodać do klasy, gdzie trzeba to zrobić. Lub możesz umieścić go w klasie statycznej gdzieś, jeśli chcesz dostać się do niego z wielu plików. Zmieniłem to nieco na to, co robię.

#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<Hyperlink>(); 
     foreach (var link in hyperlinks) 
      link.RequestNavigate += new System.Windows.Navigation.RequestNavigateEventHandler(link_RequestNavigate); 
    } 

    public static IEnumerable<DependencyObject> GetVisuals(DependencyObject root) 
    { 
     foreach (var child in LogicalTreeHelper.GetChildren(root).OfType<DependencyObject>()) 
     { 
      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 

Będziesz nazywamy go w kodzie tak:

 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; 

wszystkie rzeczy HTMLConverter można znaleźć na stronie: http://blogs.msdn.com/b/wpfsdk/archive/2006/05/25/606317.aspx to jeśli trzeba konwertować HTML do dokumentu Flow. Chociaż jest to nieco poza zakresem tego tematu.