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

Prashant Cholachagudda
fonte
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" />
MichaC
fonte
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.

cristãos
fonte
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>
Anderson Imes
fonte
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

Siavash Mortazavi
fonte
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>
xmedeko
fonte
2

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

<Button>
    <Hyperlink>
</Button>
Ana betts
fonte
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.