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

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

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


person Prashant Cholachagudda    schedule 23.04.2009    source источник
comment
Если кого-то это волнует, проблема со всеми ответами здесь заключается в том, что ссылки в ответах на самом деле не ведут себя как ссылки. Они не знают об истории посещенных URL-адресов, а цвета не являются системными цветами URL-адресов. Но, если у вас нет этих требований, они в порядке.   -  person    schedule 20.10.2010
comment
Я пытаюсь понять, как использовать правильные цвета Windows. stackoverflow.com/questions/5094447   -  person Zack Peterson    schedule 24.02.2011


Ответы (6)


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

<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" />
person MichaC    schedule 23.04.2009
comment
Обратите внимание, что здесь опечатка - LinkButon - person GarethD; 03.02.2012
comment
Этот ответ создает кнопку с пробелом между подчеркиванием и текстом. Ответ @Christians разрешает это. - person Greg Sansom; 22.02.2012
comment
Это также не имеет указателя руки при наведении курсора на гиперссылку. Используйте вики-ответ сообщества для этой функции. - person AlbatrossCafe; 22.07.2017
comment
Я предлагаю добавить <Trigger Property="IsEnabled" Value="False"><Setter Property="Foreground" Value="Gray" /> </Trigger> для обработки состояния IsEnabled - person simon; 15.05.2020

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

person Community    schedule 25.08.2010
comment
Кристиан: Почему я не вижу никакого подчеркивания в твоем стиле? У меня просто отлично работал MichaC. - person newman; 18.05.2011
comment
Это тоже не работает для меня. Стиль в ContentPresenter.Resources просто не применяется ни к одному текстовому блоку внутри кнопки. - person Clyde; 29.11.2012
comment
ОК, похоже, проблема в том, что стиль применяется только к неявно сгенерированному TextBlock - person Clyde; 29.11.2012
comment
‹Стиль кнопки={StaticResource LinkButton}›Текст‹/Кнопка› работает - person Clyde; 29.11.2012
comment
‹Button Style={StaticResource LinkButton}› ‹TextBlock Text=test/›‹/Button› не работает - person Clyde; 29.11.2012
comment
Задавая это как отдельный вопрос здесь: stackoverflow.com/questions/13628101/ - person Clyde; 29.11.2012
comment
Идеально. Я бы сделал одно крошечное дополнение к триггерам стиля, чтобы отображать серый текстовый блок, если кнопка отключена. <Trigger Property="IsEnabled" Value="false"> <Setter Property="Foreground" Value="Gray" /> </Trigger> - person Rubio; 07.03.2013

Вот предложение 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>
person Community    schedule 27.05.2010
comment
Сделал это вики сообщества, учитывая, что 99% этого ответа украдено у MichaC :) - person Anderson Imes; 27.05.2010

Самый простой способ (я делаю это в своем приложении):

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

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

person Siavash Mortazavi    schedule 05.01.2011
comment
Плохая практика, стиль кнопки ссылки, как предложено, намного лучше ... что, если у вас есть 50 таких кнопок LinkButton? Кроме того, что, если вам нужно добавить действие Hover или, может быть, другое украшение? - person Tomer W; 12.07.2012
comment
Я не согласен с Томером. плохая практика подразумевает, что этот более простой подход никогда не понадобится. У меня сейчас есть случай, когда это было идеальным решением, т.е. я создавал кнопку в коде программной части). Спасибо, Сиаваш. - person Gabe Halsmer; 31.01.2014
comment
Да, это не плохая практика. Это будет идеально для некоторых сценариев. - person Richard Moore; 05.03.2019

Другое решение, использующее Hyperlink, состоит в том, чтобы вставить внутрь TextBlock.

<TextBlock>
    <Hyperlink Click="...">
        <TextBlock Text="Link text" />
    </Hyperlink>
</TextBlock>
person xmedeko    schedule 02.06.2015

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

<Button>
    <Hyperlink>
</Button>
person Ana Betts    schedule 23.04.2009
comment
Coz, всякий раз, когда я пытаюсь получить родителя в визуальном дереве, он выдает исключение, говорящее, что гиперссылка не является визуальной или Visual3d - person Prashant Cholachagudda; 23.04.2009
comment
Я хочу использовать это. У меня это работает, но я не могу избавиться от тени по краям кнопки. Как ты это делаешь? - person Donny V.; 19.01.2010