Кнопка посилання у wpf


90

Як я можу зробити кнопку Button схожою на LinkButton, і я не хочу використовувати Hyperlink ... !!

Будь-які пропозиції


1
Якщо когось це цікавить, проблема з усіма відповідями тут полягає в тому, що посилання у відповідях насправді не поводяться як посилання. Вони не знають про історію відвідуваних URL-адрес, і кольори не є системними кольорами URL-адрес. Але якщо у вас немає цих вимог, вони в порядку.

Я намагаюся зрозуміти, як правильно використовувати кольори Windows. stackoverflow.com/questions/5094447
Зак Петерсон

Відповіді:


148

Якщо ви не хочете будь-якого звичайного стилю кнопки і просто хочете щось схоже на гіперпосилання, ви можете почати з цього

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

Ось те саме, що стиль:

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

і ви можете використовувати його так:

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

Зверніть увагу, що тут є помилка - LinkButon
GarethD

2
Ця відповідь дає кнопку, яка має пробіл між підкресленням та текстом. Відповідь @Christians вирішує це.
Грег Сансом

Тут також немає вказівника "рука" при наведенні на гіперпосилання. Використовуйте відповідь wiki для цієї функції.
AlbatrossCafe

Пропоную додати <Trigger Property="IsEnabled" Value="False"><Setter Property="Foreground" Value="Gray" /> </Trigger>для обробки стан IsEnabled
Сімон

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>

Версія MichaC та Anderson помістила підкреслення дещо неправильно, ось оновлена ​​версія, яка просто додасть підкреслення до будь-якого, TextBlockщо знаходиться всередині ContentPresenter.


1
Крістіан: Як це, я не бачу підкреслення з використанням вашого стилю? MichaC у мене просто добре працював.
Ньюмен

Це теж не працює для мене. Стиль у ContentPresenter.Resources просто не застосовується до жодного TextBlock в кнопці
Клайд

Гаразд, проблема, схоже, в тому, що стиль застосовується лише до неявно сформованого TextBlock
Клайд

<Button Style = "{StaticResource LinkButton}"> Текст </Button> працює
Клайд,

<Button Style = "{StaticResource LinkButton}"> <TextBlock Text = "test" /> </Button> не працює
Клайд,

30

Ось пропозиція MichaC, реалізована як та, 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" />
    <Setter Property="Cursor" Value="Hand" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Foreground" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

8
Зробив це wiki-спільнотою, вважаючи, що 99% цієї відповіді викрадено у MichaC :)
Андерсон Імес,

11

Найпростіший спосіб (я роблю це у своєму додатку):

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

у вас є повний контроль над TextDecoration, наприклад, зміна стилю пера чи зміщення. загляньте за цим посиланням, щоб дізнатись більше: http://msdn.microsoft.com/en-us/library/system.windows.textdecorations.underline.aspx


4
Погана практика, стилювати кнопку посилання, як пропонується, набагато краще ... а якщо у вас є 50 таких кнопок LinkButtons? Крім того, як щодо того, якщо вам потрібно додати дію наведення курсору чи, можливо, інше прикраса?
Tomer W

3
Я не згоден з Томером. "погана практика" означає, що ніколи не потрібен такий простіший підхід. Зараз у мене є випадок, коли це було ідеальне рішення, тобто створення кнопки в коді). Дякую Сіяву.
Гейб Халсмер,

Так, це не погана практика. Це буде ідеально для деяких сценаріїв.
Річард Мур,

8

Інше рішення, яке використовується, Hyperlink- це ввести всередину TextBlock.

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

2

Чому ви не хочете використовувати гіперпосилання?

<Button>
    <Hyperlink>
</Button>

Кожний раз, коли я намагаюся отримати батьків у візуальному дереві, він видає виняток, який говорить, що гіперпосилання не є візуальним чи Visual3d
Прашант Чолачагудда,

Я хочу цим скористатися. Я змусив це працювати, але я, здається, не можу позбутися тіні по краях кнопки. Як ти це робиш?
Донні В.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.