51 votes

Comment créer un simple lien hypertexte en XAML ?

Tout ce que je veux faire, c'est créer un petit hyperlien dans XAML. J'ai tout essayé. J'abandonne.

Quelle est la syntaxe pour cela ?

<StackPanel Width="70" HorizontalAlignment="Center">

    <Hyperlink Click="buttonClose_Click" Cursor="Hand" 
         Foreground="#555" Width="31" Margin="0 0 0 15"  
         HorizontalAlignment="Right">Close</Hyperlink>

    <Button Width="60" Margin="0 0 0 3">Test 1</Button>
    <Button Width="60" Margin="0 0 0 3">Test 2</Button>
    <Button Width="60" Margin="0 0 0 3">Test 3</Button>
    <Button Width="60" Margin="0 0 0 3">Test 4</Button>
</StackPanel>

Équipe Visual Studio : Dans Visual Studio 2010, je veux que Clippy apparaisse et dise "Il semble que vous essayez de créer un hyperlien" et me dise comment faire. Vous ne pouvez pas faire ça avec le MEF ? Ce serait rétro cool, et ces petits problèmes de "comment faire ce que je sais déjà faire en HTML" font perdre beaucoup de temps pendant le processus d'apprentissage de XAML.

168voto

Joe White Points 32629

Vous ne pouvez pas ajouter un hyperlien à un StackPanel : vous obtiendrez une erreur d'exécution. (En fait, je suis un peu surpris que ce ne soit pas une erreur de compilation.) C'est parce que Hyperlink ne vit pas dans le côté "contrôles" de WPF avec <Button> et <StackPanel> et d'autres choses qui sont disposées sur des morceaux d'écran rectangulaires et qui descendent de UIElement . Au lieu de cela, il vit dans le côté "texte" des choses, avec <Bold> et <Run> et <Paragraph> et d'autres choses généralement textuelles qui enveloppent les mots et coulent dans des lignes et des paragraphes et descendent de TextElement .

Une fois que vous avez réalisé qu'il y a deux hiérarchies de classes distinctes avec des comportements de mise en page différents, il est logique que Hyperlink soit du côté "texte" des choses (il est facile d'avoir par exemple un paragraphe avec un hyperlien au milieu, et même pour cet hyperlien d'envelopper à travers un saut de ligne).

Mais non, ce n'est pas si facile à découvrir quand on débute.

Pour mélanger les deux mondes, et utiliser un lien hypertexte comme contrôle, il suffit de le placer dans un TextBlock. Un TextBlock est un objet ressemblant à un contrôle (c'est-à-dire qu'il peut être placé dans un StackPanel) qui contient des objets ressemblant à du texte (c'est-à-dire qu'il peut contenir un hyperlien) :

<TextBlock><Hyperlink Click="buttonClose_Click">Close</Hyperlink></TextBlock>

37voto

Nir Points 18250

Vous pouvez utiliser un bouton avec un modèle de contrôle personnalisé. Le code ci-dessous est un bouton de style hyperlien limité (par exemple, il ne prend en charge que les hyperliens textuels), mais il vous guidera peut-être dans la bonne direction.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style x:Key="Link" TargetType="Button">
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
    <Setter Property="Cursor" Value="Hand"/>
    <Setter Property="Foreground" Value="Blue"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <TextBlock TextDecorations="Underline" 
                    Text="{TemplateBinding Content}"
                    Background="{TemplateBinding Background}"/>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Foreground" Value="Red"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
</Page.Resources>
<Button Content="Click Me!" Style="{StaticResource Link}"/>
</Page>

28voto

Nalan M Points 834

Essayez comme ça,

<TextBlock> <Hyperlink FontWeight="Black" Foreground="#0066B3" RequestNavigate="Hyperlink_RequestNavigate" NavigateUri="http://www.msn.com"> MSN  </Hyperlink> 
</TextBlock>

 private void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
            {
                System.Diagnostics.Process.Start("http://www.msn.com");
            }

4voto

Brett Ryan Points 4905

Si vous souhaitez lier des valeurs autres que de simples valeurs textuelles, vous devrez peut-être utiliser ContentPresenter sinon rien n'apparaîtra, ce qui peut être vrai si vous vous liez à une source de données XML.

Un déclencheur de propriété pour IsMouseOver permet de souligner le texte.

Un exemple de liaison avec XML est présenté ci-dessous.

<Style x:Key="JobNumberStyleButton" TargetType="{x:Type Button}">
  <Setter Property="VerticalAlignment" Value="Top"/>
  <Setter Property="HorizontalAlignment" Value="Left"/>
  <Setter Property="Cursor" Value="Hand"/>
  <Setter Property="Background" Value="Transparent"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <TextBlock>
          <ContentPresenter
            Margin="0,0,0,0"
            ContentTemplate="{TemplateBinding ContentTemplate}"
            Content="{TemplateBinding Content}"
            ContentStringFormat="{TemplateBinding ContentStringFormat}"
            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
            VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
            RecognizesAccessKey="False"
            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
        </TextBlock>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
  <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="Button">
            <TextBlock Padding="0,0,0,0" Margin="0,0,0,0">
              <Underline>
                <ContentPresenter
                  Margin="0,0,0,0"
                  ContentTemplate="{TemplateBinding ContentTemplate}"
                  Content="{TemplateBinding Content}"
                  ContentStringFormat="{TemplateBinding ContentStringFormat}"
                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                  RecognizesAccessKey="False"
                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
              </Underline>
            </TextBlock>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Trigger>
  </Style.Triggers>
</Style>

1voto

Stefano Driussi Points 1929

Habituellement, la signification d'un hyperlien est de donner une ancre pour envoyer l'utilisateur vers une autre page ou, d'une manière générale, vers une autre ressource, donc il est mis en œuvre de cette manière et vous devez spécifier l'emplacement de cette ressource comme ceci :

<HyperLink NavigateUri="http://www.site.com">
   Web Site
</HyperLink>

Cependant, j'ai trouvé ce blog avec un bloc de texte personnalisé qui est utilisé comme un hyperlien et prend en charge les événements de clic.

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