我想使用WPF中的链接样式的button。 微软在Windows对话框中这样做(看起来不一致)。
他们看起来像蓝色的文字。 当鼠标hover时改变颜色和下划线。
我得到了它的工作。 (感谢Christian , Anderson Imes和MichaC )但是,我不得不在我的button里放一个TextBlock
。
我怎样才能改进我的风格 – 使其工作,而不需要我的button内的TextBlock?
<Button Style="{StaticResource HyperlinkLikeButton}"> <TextBlock>Edit</TextBlock> </Button>
<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>
<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
事件。