Как сделать кнопку 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>
Ответы
Ответ 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
.