Изменение переднего плана гиперссылки без потери цвета при наведении курсора

Я пишу приложение WPF и хочу, чтобы одни из моих гиперссылок были синими по умолчанию, а другие - зелеными. Нет проблем - я могу просто установить Foreground:

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

Проблема в том, что когда я это делаю, эффект зависания уходит. В обычной гиперссылке, когда я перемещаю указатель мыши по ссылке, она становится красной, а когда я убираю указатель мыши, она снова становится синей. Но в гиперссылке с назначенным свойством Foreground всегда этот цвет - красный при наведении курсора полностью подавляется.

Как я могу изменить цвет гиперссылки без потери поведения и цвета при наведении курсора по умолчанию?


person Joe White    schedule 10.08.2009    source источник


Ответы (2)


Непосредственная установка переднего плана (как вы это сделали) не работает, и установка его в стиле тоже не работает, если вы не "заимствуете" этот стиль из стиля гиперссылки по умолчанию (который должен включить триггер 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 более читаемым, но приведенный выше код выполняет свою работу.

person Matt Hamilton    schedule 10.08.2009
comment
Действительно, есть - я пробовал нечто подобное, но мне не хватало BasedOn. Спасибо! - person Joe White; 10.08.2009
comment
lol Я только что нашел этот ответ в Google, пытаясь решить ту же проблему. Я бы проголосовал за себя, если бы мог! :) - person Matt Hamilton; 16.02.2010
comment
Я использовал это с тегом Style без каких-либо сеттеров в ситуации, когда Hyperlink, похоже, не учитывает свой собственный стиль по умолчанию, который я определил для него в отдельном файле словаря ресурсов, который я объединил. Очень странный ... - person sergiol; 14.11.2011
comment
Кажется, это не работает, когда гиперссылка находится внутри RichTextBox, есть идеи, почему? - person Yoav Feuerstein; 16.08.2017

Вы должны создать свою гиперссылку следующим образом

<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>
person Riz    schedule 01.05.2019