如何仅在禁用超链接时在超链接上显示工具提示

本文关键字:超链接 工具提示 显示 何仅 | 更新日期: 2023-09-27 18:18:45

这是对我上一个问题的更具体的描述,并附有后续的回答。

在XAML中定义了一个标准超链接:

<TextBlock>
    <Hyperlink IsEnabled="{Binding LinkEnabled}">
        <TextBlock Text="{Binding Text}"/>
    </Hyperlink>
</TextBlock>

超链接的IsEnabled属性绑定到视图模型上的一个属性,该属性的值可以更改。我需要在超链接上放置一个工具提示,它只会在超链接被禁用时显示。

如何仅在禁用超链接时在超链接上显示工具提示

若要仅在禁用超链接时显示工具提示,则使用ToolTipService。ShowOnDisabled和ToolTipService。必须在超链接上设置IsEnabled(带有否定转换器)属性:

<TextBlock>
    <Hyperlink IsEnabled="{Binding LinkEnabled}"
               ToolTip="ToolTip"
               ToolTipService.ShowOnDisabled="True"
               ToolTipService.IsEnabled="{Binding IsEnabled, RelativeSource={RelativeSource Self}, Converter={StaticResource negateConverter}}">
        <TextBlock Text="{Binding Text}"/>
    </Hyperlink>
</TextBlock>

然而,工具提示不会显示,因为一旦超链接被禁用,它就不再是可测试的,因为它包含在TextBlock中(或我的理解)。

因此,解决方案是改变父TextBlock上的"IsEnabled"属性,而不是在超链接上。但是,这是可行的:
<TextBlock IsEnabled="False">

但这不是:

<TextBlock IsEnabled="{Binding LinkEnabled}">

在后一种情况下,改变TextBlock的IsEnabled属性不会改变超链接的IsEnabled属性。要解决这个问题,必须将超链接的IsEnabled属性绑定到父属性。

下面是实际的解决方案,全部放在一起:

<TextBlock IsEnabled="{Binding LinkEnabled}">
    <Hyperlink IsEnabled="{Binding IsEnabled, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type FrameworkElement}}}"
               ToolTip="ToolTip"
               ToolTipService.ShowOnDisabled="True"
               ToolTipService.IsEnabled="{Binding IsEnabled, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type FrameworkElement}}, Converter={StaticResource negateConverter}}">
        <TextBlock Text="{Binding Text}"/>
    </Hyperlink>
</TextBlock>