Botão de link no wpf


90

Como posso fazer o botão se parecer com o LinkButton e não quero usar o Hyperlink ... !!

Alguma sugestão


1
Se alguém se importar, o problema com todas as respostas aqui é que os links nas respostas não se comportam como links. Eles não estão cientes do histórico de urls visitados e as cores não são as cores de urls do sistema. Mas, se você não tiver esses requisitos, eles estão bem.

Estou tentando descobrir como usar as cores corretas do Windows. stackoverflow.com/questions/5094447
Zack Peterson

Respostas:


148

Se você não quiser nenhum estilo de botão normal e apenas quiser algo que se pareça com um hiperlink, você pode começar com isto

<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>

Aqui está o mesmo que estilo:

<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>

e você pode usá-lo assim:

<Button Style="{StaticResource LinkButton}" Content="Clicky" />

Observe que há um erro de digitação aqui - LinkButon
GarethD

2
Essa resposta produz um botão que tem um espaço entre o sublinhado e o texto. A resposta @Christians resolve isso.
Greg Sansom

Isso também não tem o ponteiro "mão" ao passar o mouse sobre o hiperlink. Use a resposta do wiki da comunidade para esta funcionalidade.
AlbatrossCafe

Eu sugiro adicionar <Trigger Property="IsEnabled" Value="False"><Setter Property="Foreground" Value="Gray" /> </Trigger>para lidar com o estado 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>

A versão de MichaC e Anderson colocou o sublinhado um pouco errado, aqui está uma versão atualizada que apenas adicionará um sublinhado a qualquer um TextBlockque esteja dentro do ContentPresenter.


1
Christian: Por que não consigo ver nenhum sublinhado no seu estilo? MichaC funcionou bem para mim.
newman

Isso também não está funcionando para mim. O estilo em ContentPresenter.Resources simplesmente não está sendo aplicado a nenhum TextBlock dentro do Button
Clyde

OK, o problema parece ser que o estilo só se aplica a um TextBlock gerado implicitamente
Clyde

<Button Style = "{StaticResource LinkButton}"> Texto </Button> funciona
Clyde

<Button Style = "{StaticResource LinkButton}"> <TextBlock Text = "test" /> </Button> não funciona
Clyde

30

Aqui está a sugestão de MichaC implementada como um Styleque você pode reutilizar em qualquer botão:

<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>

8
Tornou isso um wiki da comunidade, considerando que 99% desta resposta foi roubada de MichaC :)
Anderson Imes

11

A maneira mais fácil (faço isso em meu aplicativo):

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

você tem controle total sobre TextDecoration, por exemplo, alterar o estilo da caneta ou deslocamento. dê uma olhada neste link para saber mais: http://msdn.microsoft.com/en-us/library/system.windows.textdecorations.underline.aspx


4
Má prática, definir o estilo de um botão de link conforme sugerido é muito melhor ... e se você tiver 50 LinkButtons assim? Além disso, se você precisar adicionar uma ação de pairar ou talvez uma decoração diferente?
Tomer W

3
Eu discordo de Tomer. "má prática" implica que nunca há necessidade dessa abordagem mais simples. Eu tenho um caso agora em que esta era a solução perfeita, ou seja, estava criando um botão no code-behind). Obrigado Siavash.
Gabe Halsmer

Sim, esta não é uma prática ruim. Será perfeito para alguns cenários.
Richard Moore

8

Outra solução Hyperlinké colocar dentro TextBlock.

<TextBlock>
    <Hyperlink Click="...">
        <TextBlock Text="Link text" />
    </Hyperlink>
</TextBlock>

2

Por que você não quer usar o Hyperlink?

<Button>
    <Hyperlink>
</Button>

Porque, sempre que tento obter o pai na árvore Visual, ele lança uma exceção dizendo que o hiperlink não é visual ou Visual3d
Prashant Cholachagudda

Eu quero usar isso. Fiz funcionar, mas não consigo me livrar da sombra nas bordas do botão. Como você faz isso?
Donny V.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.