Wpf'de bağlantı düğmesi


90

Button'ın LinkButton gibi görünmesini nasıl sağlayabilirim ve Köprü kullanmak istemiyorum ... !!

Herhangi bir öneri


1
Biri umursuyorsa, buradaki tüm cevaplarla ilgili sorun, cevaplardaki bağlantıların aslında bağlantılar gibi davranmamasıdır. Ziyaret edilen url geçmişinin farkında değiller ve renkler sistem url renkleri değil. Ancak, bu gereksinimlere sahip değilseniz, sorun değil.

Doğru Windows renklerini nasıl kullanacağımı anlamaya çalışıyorum. stackoverflow.com/questions/5094447
Zack Peterson

Yanıtlar:


150

Normal Button stilinin hiçbirini istemiyor ve sadece bir köprü gibi görünen bir şey istiyorsanız, bununla başlayabilirsiniz.

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

İşte bir stille aynı:

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

ve bunu şu şekilde kullanabilirsiniz:

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

Lütfen burada bir yazım hatası olduğunu unutmayın - LinkButon
GarethD

2
Bu cevap, alt çizgi ile metin arasında boşluk bulunan bir düğme üretir. @Christians cevap bunu çözer.
Greg Sansom

Bu, köprünün üzerine gelindiğinde "el" işaretçisine de sahip değildir. Bu işlev için topluluk wiki yanıtını kullanın.
AlbatrossCafe

<Trigger Property="IsEnabled" Value="False"><Setter Property="Foreground" Value="Gray" /> </Trigger>IsEnabled durumuna eklemenizi öneririm
simon

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

MichaC en ve Anderson'un versiyonu biraz yanlış altı çizili yerleştirilir, burada sadece herhangi bir altı çizili katacak güncelleştirilmiş versiyonu TextBlockiçeride olduğunu ContentPresenter.


1
Christian: Tarzınızı kullanırken nasıl alt çizgi göremiyorum? MichaC benim için iyi çalıştı.
newman

Bu benim için de çalışmıyor. ContentPresenter.Resources içindeki stil, Düğme içindeki herhangi bir TextBlock'a uygulanmıyor
Clyde

Tamam, sorun şu ki, stil yalnızca örtük olarak oluşturulmuş bir TextBlock
Clyde

<Button Style = "{StaticResource LinkButton}"> Metin </Button> çalışıyor
Clyde

<Button Style = "{StaticResource LinkButton}"> <TextBlock Text = "test" /> </Button> çalışmıyor
Clyde

30

MichaC'ın Styleherhangi bir düğmede yeniden kullanabileceğiniz bir önerisi :

<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
Bu cevabın% 99'unun MichaC'dan çalındığını düşünerek bunu bir topluluk wiki'si yaptık :)
Anderson

11

En kolay yol (bunu başvurumda yapıyorum):

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

TextDecoration üzerinde tam kontrole sahipsiniz, örneğin kalem stilini veya ofseti değiştirin. daha fazlasını öğrenmek için bu bağlantıya bir göz atın: http://msdn.microsoft.com/en-us/library/system.windows.textdecorations.underline.aspx


4
Kötü Uygulama, Bir Bağlantı Düğmesini Önerildiği gibi Biçimlendirmek Çok daha iyidir ... Ya bunun gibi 50 LinkButton'a sahipseniz? Ek olarak, bir Fareyle Üzerine Gelme eylemi veya belki farklı bir dekorasyon eklemeniz gerekirse ne olacak?
Tomer W

3
Tomer'a katılmıyorum. "kötü uygulama", bu daha basit yaklaşıma asla ihtiyaç olmadığı anlamına gelir. Şu anda bunun mükemmel bir çözüm olduğu bir durum var, yani arka planda düğme yaratmak gibi). Teşekkürler Siavash.
Gabe Halsmer

Evet, bu kötü bir uygulama değil. Bazı senaryolar için mükemmel olacak.
Richard Moore

9

Kullanılan başka bir çözüm Hyperlinkde içine koymaktır TextBlock.

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

2

Neden Köprü kullanmak istemiyorsunuz?

<Button>
    <Hyperlink>
</Button>

Coz, Ne zaman bir ebeveyni Görsel ağacında bulmaya çalışsam, Köprü görsel veya Görsel3d değil diyen bir İstisna atıyor
Prashant Cholachagudda

Bunu kullanmak istiyorum Çalışmaya başladım ama düğmenin kenarlarındaki gölgeden kurtulamıyorum. Bunu nasıl yaptın?
Donny V.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.