web-dev-qa-db-fra.com

Comment puis-je faire ressembler un bouton WPF à un lien?

Je souhaite utiliser dans [~ # ~] wpf [~ # ~] des boutons de style liens. Microsoft fait cela (apparemment de manière incohérente) dans ses boîtes de dialogue Windows.

Ils ressemblent à du texte bleu. Et changez de couleur et soulignez lorsque le curseur de la souris survole.

Exemple:

LinkButton in Windows 7

Je l'ai fait fonctionner. (merci à Christian , Anderson Imes , et MichaC ) Mais, j'ai dû mettre un TextBlock à l'intérieur de mon bouton.

Comment puis-je améliorer mon style - pour le faire fonctionner sans nécessiter le TextBlock à l'intérieur de mon bouton?

Utilisation XAML

<Button Style="{StaticResource HyperlinkLikeButton}">
    <TextBlock>Edit</TextBlock>
</Button>

Style XAML

<Style x:Key="HyperlinkLikeButton" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <ContentPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" />
    <Setter Property="Cursor" Value="Hand" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <ControlTemplate.Resources>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="TextDecorations" Value="Underline" />
                            </Style>
                        </ControlTemplate.Resources>
                        <ContentPresenter />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>
36
Zack Peterson

Savez-vous qu'il existe une Hyperlink class/tag? Il ressemble à un lien hypertexte et peut également fonctionner comme bouton (peut utiliser l'URI et/ou la commande et/ou cliquer sur l'événement).

ÉDITER:

Exemple d'utilisation:

<TextBlock>                                
    <Hyperlink Command="{Binding SomeCommand, ElementName=window}" CommandParameter="{Binding}">Link
    </Hyperlink>
</TextBlock>
36
Matěj Zábský

Je suis un peu en retard pour la fête mais ...

L'approche la plus simple et la plus propre de l'OMI:

<Style x:Key="HyperLinkButtonStyle" TargetType="Button">
    <Setter Property="Focusable" Value="False" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <TextBlock>
                    <Hyperlink>
                        <Run Text="{TemplateBinding Content}" />
                    </Hyperlink>
                </TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
  • Fidèle, pas d'émulation : nous utilisons juste le Hyperlink lui-même
  • Respectueux : la mise au point, qui est un aspect important, est préservée
15
Aybe

L'utilisation du style ou du modèle suivant ne vous oblige pas à utiliser l'élément TextBlock:

  <ControlTemplate x:Key="HyperlinkLikeButtonTemplate" TargetType="{x:Type Button}">
      <TextBlock x:Name="innerText" Foreground="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" Cursor="Hand" >
        <ContentPresenter />
      </TextBlock>
    <ControlTemplate.Triggers>
      <Trigger Property="Button.IsMouseOver" Value="true">
        <Setter TargetName="innerText" Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
        <Setter TargetName="innerText" Property="TextDecorations" Value="Underline" />
      </Trigger>
    </ControlTemplate.Triggers>
  </ControlTemplate>

  <Style x:Key="HyperlinkLikeButton" TargetType="{x:Type Button}">
    <Setter Property="Template" Value="{StaticResource HyperlinkLikeButtonTemplate}" />
  </Style> 

Utilisation XAML

<Button Style="{StaticResource HyperlinkLikeButton}" Content="Edit" />

ou

<Button Style="{StaticResource HyperlinkLikeButton}">
    Edit
</Button>

ou vous pouvez utiliser le modèle directement

<Button Template="{StaticResource HyperlinkLikeButtonTemplate}" Content="Edit" />
9
Yves Tkaczyk

À moins que je manque quelque chose, ne pourriez-vous pas vous en sortir avec le style de TextBlock, si vous appliquez les styles en ligne plutôt que globalement, de toute façon? Par exemple:

<Style x:Key="LinkButton" TargetType="TextBlock">            
    <Setter Property="Cursor" Value="Hand" />
    <Setter Property="Margin" Value="0,0,10,0" />
    <Setter Property="TextDecorations" Value="Underline" />
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />                 
        </Trigger>
    </Style.Triggers>
</Style>

Et donc:

<TextBlock Style="{StaticResource LinkButton}">Edit</TextBlock>

Pour activer le clic, utilisez simplement l'événement MouseUp.

1
Grant Thomas

Je pense que le problème est que le bouton est un contrôle de contenu, mais le style de lien ne fonctionne qu'avec du texte en tant que contenu. C'est la raison pour laquelle le code que vous avez est conçu de cette façon. Je pense que nous pouvons travailler dans le modèle de contrôle en spécifiant un bloc de texte au lieu du présentateur de contenu, mais quelle propriété lui est liée? Donc ma proposition est: sous-classe le bouton et déclarer une propriété de dépendance de type chaîne et utiliser cette propriété pour lier le texte dans le ControlTemplate.

1
Felice Pollano