更改超链接前景色而不失去悬停颜色

23

我正在编写一个WPF应用程序,我希望我的某些超链接是默认的蓝色,而其他超链接则为绿色。没问题--我可以设置Foreground:

<TextBlock><Hyperlink Foreground="#0C0">Mark as done</Hyperlink></TextBlock>

问题是,当我这样做时,鼠标悬停效果消失了。在普通的超链接中,当我将鼠标移动到链接上时,它会变为红色,当我将鼠标移开时,它会恢复成蓝色。但是在分配了Foreground属性的超链接中,它始终是那种颜色 - 鼠标悬停上去的红色完全被抑制了。

如何更改超链接的颜色,而不失去默认的悬停行为和颜色?

2个回答

43

直接设置前景色(就像你已经做的那样)不起作用,使用样式也不行,除非你从默认的超链接样式(必须包括OnMouseOver触发器)中“派生”该样式。所以这样可以解决问题:

<TextBlock>
    <Hyperlink>
        <Hyperlink.Style>
            <Style TargetType="Hyperlink"
                   BasedOn="{StaticResource {x:Type Hyperlink}}">
                <Setter Property="Foreground" Value="#0C0"/>
            </Style>
        </Hyperlink.Style>
        Mark as done
    </Hyperlink>
</TextBlock>

将该样式提取回 Window 资源并使用关键字引用可能会使 XAML 更易读,但上述代码已能实现其功能。


确实如此——我尝试过类似的东西,但是缺少了BasedOn。谢谢! - Joe White
23
我刚在谷歌上找到了这个答案,试图解决同样的问题。如果可以的话我会给自己投票的! :) - Matt Hamilton
我在一个情况下使用了Style标签,没有使用任何setter,此时Hyperlink似乎不考虑我在单独合并的Resource Dictionary文件中为其定义的默认样式。非常奇怪... - sergiol
这似乎在超链接位于 RichTextBox 内部时无法正常工作,有什么想法吗? - Yoav Feuerstein

3
你应该这样构建超链接:

像这样构建超链接


<TextBlock Width="Auto" HorizontalAlignment="Center">
    <Hyperlink Click="ForgotPassword_Clicked">
        <TextBlock Text="Forgot Password?"/>
    </Hyperlink>
</TextBlock>

然后这种样式就适合您使用了。
<Style TargetType="{x:Type Hyperlink}">
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="Foreground" Value="Blue" />
        <Setter Property="TextBlock.TextDecorations" Value="{x:Null}" />
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Foreground" Value="Red" />
                <Setter Property="TextBlock.TextDecorations" Value="Underline" />
            </Trigger>
        </Style.Triggers>
    </Style>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接