177 votes

Exemple d'utilisation d'un lien hypertexte dans WPF

J'ai vu plusieurs suggestions selon lesquelles il est possible d'ajouter un lien hypertexte à une application WPF par l'intermédiaire de Hyperlink contrôle.

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

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        mc:Ignorable="d" 
        x:Class="BookmarkWizV2.InfoPanels.Windows.UrlProperties"
        Title="UrlProperties" Height="754" Width="576">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="40"/>
        </Grid.RowDefinitions>
        <Grid>
            <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto" Grid.RowSpan="2">
                <StackPanel >
                    <DockPanel LastChildFill="True" Margin="0,5">
                        <TextBlock Text="Url:" Margin="5" 
                            DockPanel.Dock="Left" VerticalAlignment="Center"/>
                        <TextBox Width="Auto">
                            <Hyperlink NavigateUri="http://www.google.co.in">
                                    Click here
                            </Hyperlink>   
                        </TextBox>                      
                    </DockPanel >
                </StackPanel>
            </ScrollViewer>        
        </Grid>
        <StackPanel HorizontalAlignment="Right" Orientation="Horizontal" Margin="0,7,2,7" Grid.Row="1" >
            <Button Margin="0,0,10,0">
                <TextBlock Text="Accept" Margin="15,3" />
            </Button>
            <Button Margin="0,0,10,0">
                <TextBlock Text="Cancel" Margin="15,3" />
            </Button>
        </StackPanel>
    </Grid>
</Window>

Je reçois l'erreur suivante :

La propriété "Texte" ne prend pas en charge les valeurs de type "Lien hypertexte".

Qu'est-ce que je fais de travers ?

369voto

eandersson Points 8571

Si vous souhaitez que votre application ouvre le lien dans un fichier navigateur web vous devez ajouter un Hyperlien avec le Demande de navigation à une fonction qui ouvre par programme un navigateur web avec l'adresse comme paramètre.

<TextBlock>           
    <Hyperlink NavigateUri="http://www.google.com" RequestNavigate="Hyperlink_RequestNavigate">
        Click here
    </Hyperlink>
</TextBlock>

Dans le code-behind, vous devriez ajouter quelque chose de similaire à ceci pour gérer l'événement RequestNavigate :

private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
    // for .NET Core you need to add UseShellExecute = true
    // see https://learn.microsoft.com/dotnet/api/system.diagnostics.processstartinfo.useshellexecute#property-value
    Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
    e.Handled = true;
}

En outre, vous aurez besoin des importations suivantes :

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

Il se présentera comme suit dans votre application :

oO

4 votes

Merci, mais existe-t-il un moyen de spécifier le texte du lien ("Cliquez ici" dans ce cas) par le biais de la liaison ?

8 votes

Il suffit de placer un bloc de texte à l'intérieur de l'hyperlien et de lier la propriété Text.

0 votes

Est-il possible de faire en sorte qu'il exécute une commande au lieu de suivre un lien ?

72voto

Arthur Nunes Points 1805

En plus de la réponse de Fuji, nous pouvons rendre le gestionnaire réutilisable en le transformant en 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 utilisez-le comme suit :

<TextBlock>
    <Hyperlink NavigateUri="https://stackoverflow.com"
               custom:HyperlinkExtensions.IsExternal="true">
        Click here
    </Hyperlink>
</TextBlock>

0 votes

Une solution élégante. Je vous remercie de votre attention.

32voto

Ivan Ičin Points 1133

Si vous voulez localiser la chaîne plus tard, ces réponses ne sont pas suffisantes, je suggérerais quelque chose comme :

<TextBlock>
    <Hyperlink NavigateUri="https://speechcentral.net/">
       <Hyperlink.Inlines>
            <Run Text="Click here"/>
       </Hyperlink.Inlines>
   </Hyperlink>
</TextBlock>

30voto

H.B. Points 76352

Hyperlink es no un contrôle, il s'agit d'un contenu du flux vous ne pouvez l'utiliser que dans les contrôles qui prennent en charge le contenu de flux, comme un élément TextBlock . TextBoxes n'ont que du texte en clair.

26voto

Drew Noakes Points 69288

Il convient également de noter que Hyperlink ne doit pas nécessairement être utilisé pour la navigation. Vous pouvez le relier à une commande.

Par exemple :

<TextBlock>
  <Hyperlink Command="{Binding ClearCommand}">Clear</Hyperlink>
</TextBlock>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X