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