Comment faire un lien hypertexte simple en XAML?

Tout ce que je veux faire est de faire 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 Visual Studio: Dans Visual Studio 2010, je veux que Clippy apparaisse et dise "il semble que vous essayez de créer un lien hypertexte" et me dise comment le faire. Tu ne peux pas faire ça avec MEF? Ce serait rétro cool, et ces petits problèmes "Comment puis-je faire ce que je sais déjà faire en HTML" brûlent tellement de temps pendant le processus d'apprentissage avec XAML.

46
demandé sur Edward Tanguay 2009-02-10 12:22:02

8 réponses

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 supporte que les hyperliens textuels) mais peut-être que cela vous indiquera 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>
35
répondu Nir 2009-02-11 12:26:13

Vous ne pouvez pas ajouter un lien hypertexte à 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 L'hyperlien 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 rectangulaires d'écran et 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 et coulent dans les lignes et les paragraphes et descendent de TextElement.

Une fois que vous réalisez qu'il existe deux hiérarchies de classes distinctes avec des comportements de mise en page différents, il est logique que le lien hypertexte soit du côté "texte" des choses (il est facile, par exemple, d'avoir un paragraphe avec un lien hypertexte au milieu, et même pour que ce lien s'enroule sur un saut de ligne).

Mais non, ce n'est pas si découvrable quand vous démarrez.

Pour mélanger les deux mondes, et utiliser un lien hypertexte comme contrôle, tout ce que vous devez faire est de le mettre dans un TextBlock. TextBlock est une chose control-ish (c.-à-d., peut aller dans un StackPanel) qui contient des choses text-ish (c.-à-d., peut contenir un lien hypertexte):

<TextBlock><Hyperlink Click="buttonClose_Click">Close</Hyperlink></TextBlock>
163
répondu Joe White 2009-08-09 23:06:57

Essayez ceci:

<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("http://www.msn.com");
}
19
répondu Nalan Madheswaran 2015-06-01 12:43:26

Vous pouvez constater que si vous liez à autre chose que de simples valeurs de texte, vous devrez utiliser ContentPresenter sinon rien n'apparaîtra, cela pourrait être vrai si vous liez à une source de données XML.

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

Un exemple où je suis lié au 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
répondu Brett Ryan 2010-08-10 09:56:05
<TextBlock>
  <Hyperlink NavigateUri="{Binding YourUri}" RequestNavigate="YourRequestNavigate">
   <TextBlock Text="{Binding YourText}" />
  </Hyperlink>
</TextBlock>

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

4
répondu VampireMonkey 2016-09-20 01:40:49

, Vous pouvez simplement utiliser HyperlinkButton. Lorsque vous cliquez dessus, L'URL s'affiche dans votre navigateur web:

<HyperlinkButton
    NavigateUri="https://dev.windowsphone.com"
    TargetName="_blank"
    Content="Windows Phone Dev Center" />
2
répondu Spaso Lazarevic 2015-06-01 12:40:38

Habituellement, la signification d'un lien hypertexte est de donner une ancre pour envoyer l'utilisateur à une autre Page ou en général à une autre ressource, donc il est implémenté de telle 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 poster avec un TextBlock personnalisé qui est utilisé comme un lien hypertexte et prend en charge les événements de clic.

1
répondu Stefano Driussi 2009-02-10 09:48:07

En UWP avec mvvmcross j'utilise ceci

  <HyperlinkButton Content="{Binding TextSource, ConverterParameter=MyUrl, Converter={StaticResource Language},
           FallbackValue=_MyUrl}" NavigateUri="http://www.google.com" />
0
répondu El0din 2018-03-01 16:08:18