Bouton de lien dans wpf

90

Comment puis-je faire en sorte que Button ressemble à LinkButton et que je ne veux pas utiliser Hyperlink ... !!

Aucune suggestion

Prashant Cholachagudda
la source
1
Si quelqu'un s'en soucie, le problème avec toutes les réponses ici est que les liens dans les réponses ne se comportent pas réellement comme des liens. Ils ne connaissent pas l'historique des URL visitées et les couleurs ne sont pas les couleurs de l'URL système. Mais, si vous ne disposez pas de ces exigences, elles sont acceptables.
J'essaie de comprendre comment utiliser les couleurs Windows correctes. stackoverflow.com/questions/5094447
Zack Peterson

Réponses:

148

Si vous ne voulez pas du style Button normal et que vous voulez juste quelque chose qui ressemble à un hyperlien, vous pouvez commencer par ceci

<Button Margin="5" Content="Test" Cursor="Hand">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <TextBlock TextDecorations="Underline">
                <ContentPresenter />
            </TextBlock>
        </ControlTemplate>
    </Button.Template>
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="Foreground" Value="Blue" />
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter Property="Foreground" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

Voici la même chose qu'un style:

<Style
    x:Key="LinkButton"
    TargetType="Button">
    <Setter
        Property="Template">
        <Setter.Value>
            <ControlTemplate
                TargetType="Button">
                <TextBlock
                    TextDecorations="Underline">
                <ContentPresenter /></TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter
        Property="Foreground"
        Value="Blue" />
    <Style.Triggers>
        <Trigger
            Property="IsMouseOver"
            Value="true">
            <Setter
                Property="Foreground"
                Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

et vous pouvez l'utiliser comme ceci:

<Button Style="{StaticResource LinkButton}" Content="Clicky" />
MichaC
la source
Veuillez noter qu'il y a une faute de frappe ici - LinkButon
GarethD
2
Cette réponse produit un bouton qui a un espace entre le soulignement et le texte. La réponse de @Christians résout ce problème.
Greg Sansom
Cela n'a pas non plus le pointeur "main" lors du survol du lien hypertexte. Utilisez la réponse wiki de la communauté pour cette fonctionnalité.
AlbatrossCafe
Je suggère d'ajouter <Trigger Property="IsEnabled" Value="False"><Setter Property="Foreground" Value="Gray" /> </Trigger>pour gérer l'état IsEnabled
Simon
33
<Style x:Key="LinkButton" 
       TargetType="Button"
       BasedOn="{StaticResource ResourceKey={x:Type Button}}"
       >

    <Setter Property="Width" Value="Auto"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <ContentPresenter Content="{TemplateBinding Content}" 
                                  ContentTemplate="{TemplateBinding  ContentTemplate}"
                                  VerticalAlignment="Center"
                                  >
                    <ContentPresenter.Resources>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="TextDecorations" Value="Underline" />
                        </Style>
                    </ContentPresenter.Resources>
                </ContentPresenter>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="Blue" />
    <Setter Property="Cursor" Value="Hand" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Foreground" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

La version de MichaC et Anderson a placé le soulignement légèrement incorrect, voici une version mise à jour qui ajoutera simplement un soulignement à ceux TextBlockqui sont à l'intérieur du ContentPresenter.

chrétien
la source
1
Christian: Comment se fait-il que je ne vois aucun soulignement en utilisant votre style? MichaC a bien fonctionné pour moi.
newman
Cela ne fonctionne pas non plus pour moi. Le style dans ContentPresenter.Resources n'est tout simplement pas appliqué à un TextBlock dans le Button
Clyde
OK, le problème semble être que le style ne s'applique qu'à un TextBlock généré implicitement
Clyde
<Button Style = "{StaticResource LinkButton}"> Text </Button> fonctionne
Clyde
<Button Style = "{StaticResource LinkButton}"> <TextBlock Text = "test" /> </Button> ne fonctionne pas
Clyde
30

Voici la suggestion de MichaC implémentée en tant que Styleque vous pouvez réutiliser sur n'importe quel bouton:

<Style x:Key="LinkButton" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <TextBlock TextDecorations="Underline">
                    <ContentPresenter />
                </TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="Blue" />
    <Setter Property="Cursor" Value="Hand" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Foreground" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>
Anderson Imes
la source
8
En a fait un wiki de la communauté, considérant que 99% de cette réponse est volée à MichaC :)
Anderson Imes
11

Le moyen le plus simple (je le fais dans mon application):

<TextBlock Name="..."
   Text="..."
   Cursor="Hand"
   Foreground="Blue"
   TextDecorations="Underline"
   MouseLeftButtonUp=..."
/>

vous avez un contrôle total sur TextDecoration, par exemple changer le style du stylo ou le décalage. jetez un œil à ce lien pour en savoir plus: http://msdn.microsoft.com/en-us/library/system.windows.textdecorations.underline.aspx

Siavash Mortazavi
la source
4
Mauvaise pratique, styliser un bouton Lien comme suggéré est bien mieux ... Et si vous avez 50 LinkButtons comme ça? De plus, qu'en est-il si vous devez ajouter une action de survol ou peut-être une décoration différente?
Tomer W
3
Je ne suis pas d'accord avec Tomer. "mauvaise pratique" implique qu'il n'y a jamais besoin de cette approche plus simple. J'ai un cas en ce moment où c'était la solution parfaite, c'est-à-dire créer un bouton en code-behind). Merci Siavash.
Gabe Halsmer
Ouais, ce n'est pas une mauvaise pratique. Ce sera parfait pour certains scénarios.
Richard Moore
8

Une autre solution Hyperlinkconsiste à mettre à l'intérieur TextBlock.

<TextBlock>
    <Hyperlink Click="...">
        <TextBlock Text="Link text" />
    </Hyperlink>
</TextBlock>
xmedeko
la source
2

Pourquoi ne souhaitez-vous pas utiliser Hyperlink?

<Button>
    <Hyperlink>
</Button>
Ana Betts
la source
Coz, chaque fois que j'essaie d'obtenir un parent dans l'arbre visuel, cela lance une exception disant que le lien hypertexte n'est pas visuel ou Visual3d
Prashant Cholachagudda
Je veux utiliser ça. Je l'ai fait fonctionner mais je n'arrive pas à me débarrasser de l'ombre sur les bords du bouton. Comment tu fais ça?
Donny V.