如果绑定为 null,则隐藏工具提示

本文关键字:隐藏 工具提示 null 绑定 如果 | 更新日期: 2023-09-27 17:55:21

目前我有以下代码来显示工具提示。

<Border BorderBrush="Black"
        BorderThickness="{Binding Border}"
        Height="23"
        Background="{Binding Color}">
<ToolTipService.ToolTip>
    <TextBlock Text="{Binding TooltipInformation}" />
</ToolTipService.ToolTip>

这在包含大约 25 个项的 ItemsControl 中呈现。其中只有少数值设置为 TooltipInformation

如果TooltipInforation是一个空字符串,它仍然将包含文本块的工具提示框显示为一个非常小的窗口(大约 5px 高,20px 宽)。即使我将文本块可见性设置为折叠。

如果工具提示信息的值为 null 或空字符串,有没有办法完全删除工具提示?

如果绑定为 null,则隐藏工具提示

隐藏所有控件的空工具提示的一种方法是在 App.xaml 中包含的资源字典中创建样式。此样式将可见性设置为折叠,当工具提示为空字符串或 null 时:

<!-- Style to hide tool tips that have an empty content. -->
<Style TargetType="ToolTip">
    <Style.Triggers>
        <Trigger Property="Content"
                 Value="{x:Static sys:String.Empty}">
            <Setter Property="Visibility"
                    Value="Collapsed" />
        </Trigger>
        <Trigger Property="Content"
                 Value="{x:Null}">
            <Setter Property="Visibility"
                    Value="Collapsed" />
        </Trigger>
    </Style.Triggers>
</Style>

还包括 sys 命名空间(对于 String.Empty):

xmlns:sys="clr-namespace:System;assembly=mscorlib"
一种方法

是将ToolTip包裹在Rectangle中并赋予其Transparent颜色。然后,您只需将Visibility设置为在此RectangleCollapsed

更新:

<Border Background="#FFE45F5F">
    <Grid>
        <TextBlock Text="{Binding Property1}"/>
        <Rectangle Fill="Transparent" Visibility="{Binding Property2, Converter={StaticResource BooleanToVisibilityConverter}}" ToolTipService.ToolTip="{Binding TooltipInformation}"/>
    </Grid>
</Border>

这是一个WPF答案(还没有在Silverlight中尝试过)。

使用 ToolTipService.IsEnabled,并将其绑定到工具提示属性。然后使用转换器将工具提示字符串转换为布尔值。

例如,我有以下内容:

<TextBlock x:Name="textBlock" ToolTipService.IsEnabled="{Binding EntryToolTip, Converter={StaticResource StringNullOrEmptyToBoolConverter}}">
...
</TextBlock>

或在代码隐藏中

ToolTipService.SetIsEnabled(textBlock, false);

我在将值设置为 String.Empty 时遇到了同样的问题。将其设置为 null 可以解决此问题。

WinRT/Windows 8 App XAML

如果只使用默认工具提示,否则我建议在视图模型中将绑定值设置为 null,或者在项目为空时使用转换器。

就我而言,我有一个:

public string Name { get; }

绑定使用:

<TextBlock Text="{Binding Name}" TextTrimming="CharacterEllipsis" Tooltip="{Binding Name}" />

其中的想法是在由于缺少宽度而被剪切时在工具提示中显示全名。在我的模型中,我只是:

if (string.IsNullOrEmpty(Name)) Name = null;

至少在 .Net 4.0 中,这不会为我显示工具提示。

奇怪的是,这些答案在我的情况下都不起作用。 对顶部答案的回复暗示了它 - 如果您的工具提示与文本块相关,则该解决方案将不起作用。 我在 DataGridTemplateColumn.CellTemplate 元素中有一个 TextBlock,我只是将文本直接绑定到 TextBlock 的 ToolTip 属性,如下所示:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBlock
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            ToolTip="{Binding Path=SomeTextProperty}"
            Style="{StaticResource TextBlockOverflowStyle}"
            Text="{Binding Path=SomeTextProperty, NotifyOnSourceUpdated=True}" />
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

我最终"免费"获得了所需的行为(文本为空时的隐藏工具提示)。

您可以创建一个从字符串到布尔值的转换器,如果字符串长度为 0,则返回 false,否则返回 true,然后使用该转换器将 ToolTip.Active 绑定到 TooltipInformation。