Exemplo usando o hiperlink no WPF

Eu vi várias sugestões, que você pode adicionar o hiperlink ao aplicativo WPF através do controle de Hyperlink .

Aqui está como eu estou tentando usá-lo no meu código:

              Click here             

Estou recebendo o seguinte erro:

A propriedade ‘Text’ não suporta valores do tipo ‘Hyperlink’.

O que estou fazendo de errado?

Se você quiser que seu aplicativo abra o link em um navegador da Web, será necessário adicionar um HyperLink com o evento RequestNavigate definido para uma function que abre programaticamente um navegador da Web com o endereço como um parâmetro.

   Click here   

No code-behind você precisaria adicionar algo semelhante a isso para manipular o evento RequestNavigate.

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

Além disso, você também precisará das seguintes importações.

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

Ficaria assim na sua aplicação.

oO

Além da resposta da Fuji, podemos tornar o manipulador reutilizável transformando-o em uma propriedade anexada:

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

E usá-lo assim:

   Click here   

Hyperlink não é um controle, é um elemento de conteúdo de stream , você só pode usá-lo em controles que suportam conteúdo de stream, como um TextBlock . TextBoxes só tem texto simples.

Se você quiser localizar uma string mais tarde, então essas respostas não são suficientes, eu sugiro algo como:

        

IMHO a maneira mais simples é usar o novo controle herdado do 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; } } 

Observe também que o Hyperlink não precisa ser usado para navegação. Você pode conectá-lo a um comando.

Por exemplo:

  Clear  

Gostei da ideia de Arthur de um manipulador reutilizável, mas acho que há uma maneira mais simples de fazer isso:

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

Obviamente, pode haver riscos de segurança ao iniciar qualquer tipo de processo, por isso tenha cuidado.

Espero que isso ajude alguém também.

 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(); } } }