Ejemplo de uso de hipervínculo en WPF

He visto varias sugerencias, que puede agregar un hipervínculo a la aplicación WPF a través del control de Hyperlink .

Así es como estoy tratando de usarlo en mi código:

              Click here             

Estoy recibiendo el siguiente error:

La propiedad ‘Texto’ no admite valores del tipo ‘Hipervínculo’.

¿Qué estoy haciendo mal?

Si desea que su aplicación abra el enlace en un navegador web , debe agregar un HyperLink con el evento RequestNavigate configurado a una función que abre programáticamente un navegador web con la dirección como parámetro.

   Click here   

En el código subyacente necesitaría agregar algo similar a esto para manejar el evento RequestNavigate.

 private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) { Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri)); e.Handled = true; } 

Además, también necesitará las siguientes importaciones.

 using System.Diagnostics; using System.Windows.Navigation; 

Se vería así en tu aplicación.

oO

Además de la respuesta de Fuji, podemos hacer que el controlador sea reutilizable convirtiéndolo en una propiedad adjunta:

 public static class HyperlinkExtensions { public static bool GetIsExternal(DependencyObject obj) { return (bool)obj.GetValue(IsExternalProperty); } public static void SetIsExternal(DependencyObject obj, bool value) { obj.SetValue(IsExternalProperty, value); } public static readonly DependencyProperty IsExternalProperty = DependencyProperty.RegisterAttached("IsExternal", typeof(bool), typeof(HyperlinkExtensions), new UIPropertyMetadata(false, OnIsExternalChanged)); private static void OnIsExternalChanged(object sender, DependencyPropertyChangedEventArgs args) { var hyperlink = sender as Hyperlink; if ((bool)args.NewValue) hyperlink.RequestNavigate += Hyperlink_RequestNavigate; else hyperlink.RequestNavigate -= Hyperlink_RequestNavigate; } private static void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e) { Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri)); e.Handled = true; } } 

Y úsalo así:

   Click here   

Hyperlink no es un control, es un elemento de contenido de flujo , solo se puede usar en controles que admiten contenido de flujo, como un TextBlock . TextBoxes texto solo tienen texto sin formato.

Si desea localizar una cadena más tarde, entonces esas respuestas no son suficientes, sugeriría algo como:

        

En mi humilde opinión, la forma más sencilla es utilizar un nuevo control heredado de Hyperlink :

 ///  /// Opens  in a default system browser ///  public class ExternalBrowserHyperlink : Hyperlink { public ExternalBrowserHyperlink() { RequestNavigate += OnRequestNavigate; } private void OnRequestNavigate(object sender, RequestNavigateEventArgs e) { Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri)); e.Handled = true; } } 

Tenga en cuenta también que el Hyperlink no tiene que ser utilizado para la navegación. Puedes conectarlo a un comando.

Por ejemplo:

  Clear  

Me gustó la idea de Arthur de un controlador reutilizable, pero creo que hay una manera más simple de hacerlo:

 private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) { if (sender.GetType() != typeof (Hyperlink)) return; string link = ((Hyperlink) sender).NavigateUri.ToString(); Process.Start(link); } 

Obviamente, podría haber riesgos de seguridad al comenzar cualquier tipo de proceso, así que tenga cuidado.

Espero que esto ayude a alguien también.

 using System.Diagnostics; using System.Windows.Documents; namespace Helpers.Controls { public class HyperlinkEx : Hyperlink { protected override void OnClick() { base.OnClick(); Process p = new Process() { StartInfo = new ProcessStartInfo() { FileName = this.NavigateUri.AbsoluteUri } }; p.Start(); } } }