【问题标题】: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 或空字符串,有没有办法完全删除工具提示?

【问题讨论】:

    标签: c# silverlight xaml binding tooltip


    【解决方案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 这对我有用,更适合我们的应用程序。我们可能在许多不同类型的控件中提供了数十个工具提示,因此样式仍然是多余的。此外,我们在某些地方(但不是其他地方)有专门的工具提示。这种方法允许以单一方式说“摆脱空白”,我们可以在任何地方使用。
        猜你喜欢
        • 2019-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        相关资源
        最近更新 更多