【问题标题】:Link button in wpfwpf中的链接按钮
【发布时间】:2010-10-21 07:03:00
【问题描述】:

如何使 Button 看起来像 LinkBut​​ton,而我不想使用 超链接...!!

任何建议

【问题讨论】:

  • 如果有人关心的话,这里所有答案的问题是答案中的链接实际上并不像链接。他们不知道访问过的 url 历史记录,并且颜色不是系统 url 颜色。但是,如果您没有这些要求,也没关系。
  • 我试图弄清楚如何使用正确的 Windows 颜色。 stackoverflow.com/questions/5094447

标签: wpf wpf-controls


【解决方案1】:

如果您不想要任何普通的 Button 样式,而只想要看起来像超链接的东西,您可以从这个开始

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

【讨论】:

  • 请注意这里有一个错字 - LinkBut​​on
  • 这个答案会产生一个按钮,在下划线和文本之间有一个空格。 @Christians 的回答解决了这个问题。
  • 鼠标悬停在超链接上时也没有“手”指针。使用此功能的社区 wiki 答案。
  • 我建议添加&lt;Trigger Property="IsEnabled" Value="False"&gt;&lt;Setter Property="Foreground" Value="Gray" /&gt; &lt;/Trigger&gt;来处理IsEnabled状态
【解决方案2】:
<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 和 Anderson 的版本将下划线略微错误,这是一个更新版本,它只会在 ContentPresenter 内的任何 TextBlock 上添加下划线。

【讨论】:

  • Christian:我怎么看不到你的风格下划线? MichaC 对我来说效果很好。
  • 这对我也不起作用。 ContentPresenter.Resources 中的样式并未应用于 Button 中的任何 TextBlock
  • 好的,问题似乎是样式只适用于隐式生成的TextBlock
  • 有效
  • 不起作用
【解决方案3】:

以下是 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>

【讨论】:

  • 将其设为社区 wiki,考虑到该答案的 99% 是从 MichaC 窃取的 :)
【解决方案4】:

最简单的方法(我在我的应用程序中这样做):

<TextBlock Name="..."
   Text="..."
   Cursor="Hand"
   Foreground="Blue"
   TextDecorations="Underline"
   MouseLeftButtonUp=..."
/>

您可以完全控制 TextDecoration,例如更改笔样式或偏移量。 查看此链接以了解更多信息:http://msdn.microsoft.com/en-us/library/system.windows.textdecorations.underline.aspx

【讨论】:

  • 不好的做法,按照建议设置链接按钮的样式要好得多...如果您有 50 个这样的链接按钮怎么办?此外,如果您需要添加悬停动作或不同的装饰怎么办?
  • 我不同意 Tomer。 “不良做法”意味着永远不需要这种更简单的方法。我现在有一个案例,这是完美的解决方案,即在代码隐藏中创建按钮)。谢谢 Siavash。
  • 是的,这不是一个坏习惯。它非常适合某些场景。
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

    为什么不想使用超链接?

    <Button>
        <Hyperlink>
    </Button>
    

    【讨论】:

    • Coz,每当我尝试在 Visual 树中获取父级时,它都会抛出一个异常,指出超链接不是可视的或 Visual3d
    • 我想用这个。我让它工作了,但我似乎无法摆脱按钮边缘的阴影。你是怎么做到的?
    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2021-11-26
    • 2010-10-27
    相关资源
    最近更新 更多