Exemple d’utilisation d’un lien hypertexte dans WPF

J’ai vu plusieurs suggestions, que vous pouvez append un lien hypertexte à l’application WPF via le contrôle Hyperlink .

Voici comment j’essaie de l’utiliser dans mon code:

              Click here             

Je reçois l’erreur suivante:

La propriété ‘Text’ ne prend pas en charge les valeurs de type ‘Hyperlink’.

Qu’est-ce que je fais mal?

Si vous souhaitez que votre application ouvre le lien dans un navigateur Web, vous devez append un HyperLink avec l’événement RequestNavigate défini sur une fonction qui ouvre par programme un navigateur Web avec l’adresse en tant que paramètre.

   Click here   

Dans le code-behind, vous devez append quelque chose de similaire pour gérer l’événement RequestNavigate.

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

De plus, vous aurez également besoin des importations suivantes.

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

Cela ressemblerait à ceci dans votre application.

oO

En plus de la réponse de Fuji, nous pouvons rendre le gestionnaire réutilisable en le transformant en une propriété attachée:

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

Et l’utiliser comme ça:

   Click here   

Hyperlink n’est pas un contrôle, c’est un élément de contenu de stream , vous ne pouvez l’utiliser que dans des contrôles qui prennent en charge le contenu de stream, comme un TextBlock . TextBoxes ne TextBoxes que du texte brut.

Si vous voulez localiser une chaîne plus tard, alors ces réponses ne suffisent pas, je suggère quelque chose comme:

        

IMHO le moyen le plus simple est d’utiliser un nouveau contrôle hérité de l’ 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; } } 

Notez également que l’ Hyperlink ne doit pas nécessairement être utilisé pour la navigation. Vous pouvez le connecter à une commande.

Par exemple:

  Clear  

J’ai aimé l’idée d’Arthur d’un gestionnaire réutilisable, mais je pense qu’il existe un moyen plus simple de le faire:

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

De toute évidence, le démarrage de tout type de processus pourrait présenter des risques pour la sécurité, alors faites attention.

J’espère que cela aidera aussi quelqu’un.

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