web-dev-qa-db-fra.com

Comment créer un hyperlien simple en XAML?

Tout ce que je veux faire, c'est créer un petit lien hypertexte en 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 de Visual Studio: Dans Visual Studio 2010, je veux que Clippy affiche "Il semble que vous tentiez de créer un lien hypertexte" et me dise comment procéder. Tu ne peux pas faire ça avec MEF? Ce serait rétro cool, et ces petits problèmes "comment faire ce que je sais déjà faire en HTML" prennent beaucoup de temps pendant le processus d'apprentissage avec XAML.

51
Edward Tanguay

Vous pouvez utiliser un bouton avec un modèle de contrôle personnalisé. Le code ci-dessous est un bouton de style de lien hypertexte limité (par exemple, il ne prend en charge que les liens hypertexte textuels), mais il vous indiquera peut-être 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>
37
Nir

Vous ne pouvez pas ajouter de lien hypertexte à StackPanel - vous obtiendrez une erreur d'exécution. (En fait, je suis un peu surpris que ce ne soit pas une erreur de compilation.) En effet, l'hyperlien ne réside pas dans le côté "contrôles" de WPF avec <Button> et <StackPanel> et d'autres éléments présentés sur des fragments rectangulaires d'écran et descendant. 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 que Word encapsule et coule dans des lignes et des paragraphes et descend de TextElement.

Une fois que vous réalisez qu’il existe deux hiérarchies de classes distinctes avec des comportements de présentation différents, il est logique que l’hyperlien soit du côté "texte" (cela facilite par exemple la création d’un paragraphe avec un hyperlien au milieu, et même pour cela. un lien hypertexte à traverser un saut de ligne).

Mais non, ce n'est pas si découvrable quand on commence.

Pour mélanger les deux mondes et utiliser un lien hypertexte en tant que contrôle, il vous suffit de le placer dans un TextBlock. TextBlock est un élément de contrôle (peut aller dans un StackPanel) qui contient des éléments de texte (peut contenir un lien hypertexte):

<TextBlock><Hyperlink Click="buttonClose_Click">Close</Hyperlink></TextBlock>
166
Joe White

Essaye ça:

<TextBlock>
    <Hyperlink 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(e.Uri.AbsoluteUri);
}
22
Nalan Madheswaran

Vous constaterez peut-être que si vous vous liez à autre chose que de simples valeurs de texte, vous devrez utiliser ContentPresenter, sinon rien ne s'affichera, cela pourrait être vrai si vous vous liez à une source de données XML.

Un déclencheur de propriété pour IsMouseOver donne un soulignement au texte.

Un exemple où je me lie à 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>
4
Brett Ryan
<TextBlock>
  <Hyperlink NavigateUri="{Binding YourUri}" RequestNavigate="YourRequestNavigate">
   <TextBlock Text="{Binding YourText}" />
  </Hyperlink>
</TextBlock>

Cela reliera tout texte lié dans le bloc de texte imbriqué, je n'ai pas encore trouvé de meilleur moyen, j'aimerais que le premier bloc de texte ne soit pas là si possible . Cela fonctionnera aussi pour DataTemplates.

4
VampireMonkey

Vous pouvez simplement utiliser HyperlinkButton . Lorsque vous cliquez dessus, l'URL sera affichée dans votre navigateur Web:

<HyperlinkButton
    NavigateUri="https://dev.windowsphone.com"
    TargetName="_blank"
    Content="Windows Phone Dev Center" />
2
Spaso Lazarevic

Habituellement, la signification d'un lien hypertexte 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. Il est donc implémenté de cette manière et vous devez spécifier l'emplacement de cette ressource de la manière suivante:

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

Cependant, j'ai trouvé ce blog post avec un TextBlock personnalisé utilisé comme hyperlien et prenant en charge les événements de clic.

1
Stefano Driussi

dans UWP avec mvvmcross j'utilise cette 

  <HyperlinkButton Content="{Binding TextSource, ConverterParameter=MyUrl, Converter={StaticResource Language},
           FallbackValue=_MyUrl}" NavigateUri="http://www.google.com" />
0
El0din