2010-02-18 9 views
11

Der folgende Code in einer WPF-Anwendung erstellt einen Hyperlink, und wirkt wie ein Hyperlink aussieht, aber nicht alles tun, wenn darauf geklickt.Wie kann ich einen FlowDocument Hyperlink zum Starten des Browsers und zum Aufrufen der URL in einer WPF-App erhalten?

Was muss ich ändern, damit, wenn ich es anklicke, es den Standardbrowser öffnet und zu der spezifizierten URL geht?

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

Siehe auch die spätere http://stackoverflow.com/questions/10238694/example-using-hyperlink-in-wpf - diese beiden Fragen sollten vielleicht zusammengeführt werden, aber ich bin mir nicht sicher, ob sie echte Duplikate sind. –

Antwort

16

ich die Antwort auf diese gefunden, Sie RequestNavigate und han hinzuzufügen haben dle it yourself:

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

Sie sollten es als Antwort markieren. Es funktioniert super :) –

+1

Und was, wenn ich Dokument von RTF laden? – Poma

7

Haben Sie die Lösungen für diesen Poma. Der folgende Codeabschnitt sollte Ihrer Klasse hinzugefügt werden, wo Sie dies tun müssen. Oder Sie können es irgendwo in eine statische Klasse einfügen, wenn Sie aus mehreren Dateien darauf zugreifen müssen. Ich habe es für das, was ich tue, etwas verbessert.

#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 

Sie werden es so im Code nennen: http://blogs.msdn.com/b/wpfsdk/archive/2006/05/25/606317.aspx Das ist, wenn Sie HTML in ein Fluss Dokument konvertieren müssen:

 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; 

die All HTMLConverter Sachen finden werden. Obwohl das etwas außerhalb des Rahmens dieses Themas liegt.