Подтвердить что ты не робот

Как сделать кнопку WPF похожим на ссылку?

Я хочу использовать кнопки в WPF, которые стилизованы как ссылки. Microsoft делает это (казалось бы, непоследовательно) в своих диалоговых окнах Windows.

Они выглядят как синий текст. И измените цвет и подчеркнуте, когда курсор мыши навивается над.

Пример:

LinkButton in Windows 7

Я заработал. (спасибо Кристиан, Андерсон Имес и MichaC) Но мне пришлось положить TextBlock внутри моей кнопки.

Как я могу улучшить свой стиль и работать, не требуя TextBlock внутри моей кнопки?

Использование XAML

<Button Style="{StaticResource HyperlinkLikeButton}">
    <TextBlock>Edit</TextBlock>
</Button>

Стиль XAML

<Style x:Key="HyperlinkLikeButton" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <ContentPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" />
    <Setter Property="Cursor" Value="Hand" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <ControlTemplate.Resources>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="TextDecorations" Value="Underline" />
                            </Style>
                        </ControlTemplate.Resources>
                        <ContentPresenter />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>
4b9b3361

Ответ 1

Знаете ли вы, что есть Hyperlink класс/тег? Он выглядит как гиперссылка и может работать также как кнопка (может использовать URI и/или команду и/или событие click).

EDIT:

Пример использования:

<TextBlock>                                
    <Hyperlink Command="{Binding SomeCommand, ElementName=window}" CommandParameter="{Binding}">Link
    </Hyperlink>
</TextBlock>

Ответ 2

Я немного опаздываю на вечеринку, но...

Самый простой и чистый подход IMO:

<Style x:Key="HyperLinkButtonStyle" TargetType="Button">
    <Setter Property="Focusable" Value="False" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <TextBlock>
                    <Hyperlink>
                        <Run Text="{TemplateBinding Content}" />
                    </Hyperlink>
                </TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
  • Верный, без эмуляции: мы просто используем Hyperlink
  • С уважением: фокус, который является важным аспектом, сохраняется

Ответ 3

Использование следующего стиля или шаблона не требует использования элемента TextBlock:

  <ControlTemplate x:Key="HyperlinkLikeButtonTemplate" TargetType="{x:Type Button}">
      <TextBlock x:Name="innerText" Foreground="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" Cursor="Hand" >
        <ContentPresenter />
      </TextBlock>
    <ControlTemplate.Triggers>
      <Trigger Property="Button.IsMouseOver" Value="true">
        <Setter TargetName="innerText" Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
        <Setter TargetName="innerText" Property="TextDecorations" Value="Underline" />
      </Trigger>
    </ControlTemplate.Triggers>
  </ControlTemplate>

  <Style x:Key="HyperlinkLikeButton" TargetType="{x:Type Button}">
    <Setter Property="Template" Value="{StaticResource HyperlinkLikeButtonTemplate}" />
  </Style> 

Использование XAML

<Button Style="{StaticResource HyperlinkLikeButton}" Content="Edit" />

или

<Button Style="{StaticResource HyperlinkLikeButton}">
    Edit
</Button>

или вы можете напрямую использовать шаблон

<Button Template="{StaticResource HyperlinkLikeButtonTemplate}" Content="Edit" />

Ответ 4

Я думаю, что проблема в том, что кнопка является элементом управления контентом, но стиль ссылки работает только с текстом в качестве контента. Именно по этой причине разработанный вами код разработан таким образом. Я думаю, что мы можем работать в шаблоне управления, указав текстовый блок, а не контент-презентатор, но какое свойство привязано к нему? Поэтому мое предложение: подкласс кнопки и объявить свойство зависимостей типа string и использовать это свойство для привязки текста в ControlTemplate.

Ответ 5

Если мне что-то не хватает, не могли бы вы уйти от стиля TextBlock, если вы применяете стили inline, а не глобально, так или иначе? Например:

<Style x:Key="LinkButton" TargetType="TextBlock">            
    <Setter Property="Cursor" Value="Hand" />
    <Setter Property="Margin" Value="0,0,10,0" />
    <Setter Property="TextDecorations" Value="Underline" />
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />                 
        </Trigger>
    </Style.Triggers>
</Style>

И так:

<TextBlock Style="{StaticResource LinkButton}">Edit</TextBlock>

Чтобы включить щелчок, просто используйте событие MouseUp.