如何使WPFbutton看起来像一个链接?

我想使用WPF中的链接样式的button。 微软在Windows对话框中这样做(看起来不一致)。

他们看起来像蓝色的文字。 当鼠标hover时改变颜色和下划线。

例:

LinkBut​​ton在Windows 7中

我得到了它的工作。 (感谢Christian , Anderson Imes和MichaC )但是,我不得不在我的button里放一个TextBlock

我怎样才能改进我的风格 – 使其工作,而不需要我的button内的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> 

你知道有一个超链接类/标签吗? 它看起来像一个超链接,也可以作为按钮(可以使用URI和/或命令和/或单击事件)。

编辑:

使用示例:

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

我晚会有点迟,但…

最简单和最干净的方法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> 
  • 忠实,不仿真 :我们只是使用超链接本身
  • 尊重 :保留重点,这是一个重要的方面

使用以下样式或模板不需要使用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" /> 

我觉得麻烦的是,按钮是一个内容控件,但是链接样式只能用文本作为内容。 这就是你设计的代码的原因。 我想我们可以通过指定一个文本块而不是内容展示器来控制模板,但是什么属性绑定到它呢? 所以我的建议是: 子类按钮,并声明一个类型为字符串的依赖属性,并使用该属性来绑定ControlTemplate中的文本。

除非我错过了一些东西,难道你不能摆脱样式的TextBlock ,如果你应用内联样式,而不是全球,反正呢? 例如:

 <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事件。