2010-02-18 8 views
11

Il seguente codice in un'applicazione WPF crea un collegamento ipertestuale che guarda e atti come un collegamento ipertestuale, ma non fare nulla quando si fa clic.Come posso ottenere un collegamento ipertestuale FlowDocument per avviare il browser e accedere all'URL in un'app WPF?

Che cosa devo modificare in modo che quando faccio clic, apre il browser predefinito e passa all'URL specificato?

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> 

Codice Dietro:

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

Vedere anche le successive http://stackoverflow.com/questions/10238694/example-using-hyperlink-in-wpf - queste due domande dovrebbero forse essere unite ma non sono sicuro che siano veri duplicati. –

risposta

16

ho trovato la risposta a questo, si deve aggiungere RequestNavigate e Han te stesso:

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

Dovresti contrassegnarlo come risposta. Funziona benissimo :) –

+1

E se carico il documento da RTF? – Poma

7

Hai le soluzioni per questo Poma. La sezione di codice riportata di seguito dovrebbe essere aggiunta alla classe in cui è necessario eseguire questa operazione. Oppure puoi metterlo in una classe statica da qualche parte se devi accedervi da più file. L'ho modificato leggermente per quello che sto facendo.

#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 

Ti chiami nel codice come questo:

 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; 

Tutta la roba HTMLConverter sono disponibili all'indirizzo: http://blogs.msdn.com/b/wpfsdk/archive/2006/05/25/606317.aspx Questo è se avete bisogno di convertire HTML in un documento di flusso. Anche se, questo è leggermente fuori dalla portata di questo argomento.