Кнопка ссылки в WPF

90

Как сделать так, чтобы кнопка выглядела как LinkButton, и я не хочу использовать гиперссылку ... !!

Какие-либо предложения

Прашант Чолачагудда
источник
1
Если кому-то интересно, проблема со всеми приведенными здесь ответами заключается в том, что ссылки в ответах на самом деле не ведут себя как ссылки. Им не известна история посещенных URL-адресов, и цвета не являются цветами системных URL-адресов. Но если у вас нет этих требований, все в порядке.
Я пытаюсь понять, как использовать правильные цвета Windows. stackoverflow.com/questions/5094447
Зак Петерсон

Ответы:

150

Если вам не нужен какой-либо обычный стиль кнопок и вы просто хотите что-то похожее на гиперссылку, вы можете начать с этого

<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" />
MichaC
источник
Обратите внимание, что здесь есть опечатка - LinkButon
GarethD
2
Этот ответ создает кнопку с пробелом между подчеркиванием и текстом. Ответ @Christians решает это.
Грег Сэнсом,
У этого также нет указателя «рука» при наведении курсора на гиперссылку. Используйте ответ вики сообщества для этой функции.
AlbatrossCafe
Предлагаю добавить <Trigger Property="IsEnabled" Value="False"><Setter Property="Foreground" Value="Gray" /> </Trigger>для обработки состояния IsEnabled
Саймон
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 и Андерсона поместила подчеркивание немного неправильно, вот обновленная версия, которая просто добавит подчеркивание к любому, TextBlockчто находится внутри ContentPresenter.

христианин
источник
1
Кристиан: Почему я не вижу подчеркивания в вашем стиле? MichaC у меня просто отлично сработал.
Newman
У меня это тоже не работает. Стиль в ContentPresenter.Resources просто не применяется ни к одному текстовому блоку внутри кнопки
Клайд
Хорошо, похоже, проблема в том, что стиль применяется только к неявно сгенерированному 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
Сделал это вики сообщества, учитывая, что 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 таких кнопок? Кроме того, как насчет того, чтобы добавить действие при наведении курсора или, может быть, другое украшение?
Tomer W
3
Я не согласен с Томером. «плохая практика» означает, что в этом более простом подходе нет необходимости. У меня есть случай, когда это было идеальное решение, например, создание кнопки в коде программной части). Спасибо Сиаваш.
Гейб Халсмер
Да, это неплохая практика. Он идеально подойдет для некоторых сценариев.
Ричард Мур
9

Другое решение Hyperlink- положить внутрь TextBlock.

<TextBlock>
    <Hyperlink Click="...">
        <TextBlock Text="Link text" />
    </Hyperlink>
</TextBlock>
xmedeko
источник
2

Почему вы не хотите использовать гиперссылку?

<Button>
    <Hyperlink>
</Button>
Ана Беттс
источник
Coz, всякий раз, когда я пытаюсь получить родителя в дереве визуалов, он выдает исключение, в котором говорится, что гиперссылка не является визуальной или Visual3d
Прашант Чолачагудда
Я хочу этим воспользоваться. У меня все заработало, но я не могу избавиться от тени по краям кнопки. Как ты это делаешь?
Донни В.