2009-04-23 136 views
78

如何让Button看起来像LinkBut​​ton,并且我不想使用 超链接... !!wpf中的链接按钮

任何建议

+1

如果有人关心,这里所有答案的问题是答案中的链接实际上并不像链接那样。他们不知道访问过的URL历史记录,并且颜色不是系统URL的颜色。但是,如果你没有这些要求,他们没关系。 – Will 2010-10-20 18:31:03

+0

我想弄清楚如何使用正确的Windows颜色。 http://stackoverflow.com/questions/5094447 – 2011-02-23 22:42:39

回答

131

如果你不希望任何普通按钮样式,只是想要的东西,看起来像你可以用这个

<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" /> 
+0

请注意,这里有一个错字 - LinkBut​​on – GarethD 2012-02-03 12:17:51

+2

这个答案产生一个按钮,在下划线和文本之间有一个空格。 @Christians答案可以解决这个问题。 – 2012-02-22 04:52:57

1

为什么你不想使用超链接?

<Button> 
    <Hyperlink> 
</Button> 
+0

因为,每当我尝试在Visual树中获得父项,它会抛出一个异常,说超链接不是可视化的或Visual3d – 2009-04-23 05:55:48

+0

我想要使用它。我得到它的工作,但我似乎无法摆脱按钮边缘的阴影。你是怎样做的? – 2010-01-18 22:01:07

29

这里的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> 
29
<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的和安德森的版本放在下划线稍有不当,这里是一个更新版本,将只需要加一个下划线任何TextBlockContentPresenter之内。

7

使用Hyperlink的另一个解决方案是放入TextBlock的内部。

<TextBlock> 
    <Hyperlink Click="..."> 
     <TextBlock Text="Link text" /> 
    </Hyperlink> 
</TextBlock>