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

Posted

技术标签:

【中文标题】如果绑定为空,则隐藏工具提示【英文标题】:Hide tooltip if binding is null 【发布时间】:2011-08-20 03:21:17 【问题描述】:

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

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

这在 ItemsControl 中显示,大约有 25 个项目。其中只有少数的值设置为TooltipInformation

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

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

【问题讨论】:

【参考方案1】:

您可以做到这一点的一种方法是将ToolTip 包裹在Rectangle 中,并给它一个Transparent 颜色。然后你只需在这个Rectangle 上将Visibility 设置为Collapsed

更新:

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

【讨论】:

尝试包装一个新边框,其中包含工具提示服务和堆栈面板中的文本块。然后将绑定添加到一个检查字符串是否为空的布尔值。使用 booltovisibile 转换器将该布尔值绑定到新边界的可见性。但它没有做任何事情。事实上,它禁用了每个工具提示:) 您好,请查看我的更新答案。您实际上不需要另一个面板,只需使用 Rectangle 来触发 ToolTip 的隐藏/显示。 :)【参考方案2】:

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

【讨论】:

ToolTip.Active 在当前上下文中不可用。【参考方案3】:

为所有控件隐藏空工具提示的一种方法是在 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"

【讨论】:

完美。如果可以的话,我会给你远远超过 +1 silverlight 中没有触发器。 这是最好的答案。 如果 Content 是一个 UI 元素,则不起作用,例如TextBlock. 添加 BasedOn="StaticResource x:Type ToolTip 以避免破坏现有样式(例如来自主题)【参考方案4】:

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

就我而言,我有一个:

public string Name  get; 

绑定使用:

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

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

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

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

【讨论】:

【参考方案5】:

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

WinRT/Windows 8 应用 XAML

【讨论】:

【参考方案6】:

这是一个 WPF 答案(尚未在 Silverlight 中尝试过)。

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

例如,我有以下内容:

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

或在代码隐藏中

ToolTipService.SetIsEnabled(textBlock, false);

【讨论】:

+1 这对我有用,更适合我们的应用程序。我们可能在许多不同类型的控件中提供了数十个工具提示,因此样式仍然是多余的。此外,我们在某些地方(但不是其他地方)有专门的工具提示。这种方法允许以单一方式说“摆脱空白”,我们可以在任何地方使用。

以上是关于如果绑定为空,则隐藏工具提示的主要内容,如果未能解决你的问题,请参考以下文章

如果角度属性为空,则隐藏元素

Swift:如果为空则隐藏标签

如果内容为空,则使用 php 隐藏选项卡 [关闭]

Swift3:如果为空则隐藏 UITableView

如果底层 DataContext 为空,如何隐藏控件?

如果 <td> 为空,则无法隐藏 <tr>