开发者

Hide tooltip if binding is null

开发者 https://www.devze.com 2023-03-04 14:59 出处:网络
Currently i\'ve got the following code to show a tooltip. <Border BorderBrush=\"Black\" BorderThickness=\"{Binding Border}\"

Currently i've got the following code to show a tooltip.

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

This is presented in a ItemsControl with about 25 items. Only a few of these have a value set to TooltipInformation

If TooltipInforation is an empty st开发者_运维技巧ring, it still shows the tooltipbox containing the textblock as a very small window (about 5px high and 20px wide). Even if I set the textblock visbility to collapsed.

Is there a way to completely remove the tooltip if the value of TooltipInformation is null or a empty string?


One way to hide an empty tooltip for all controls is to create a style in a resource dictionary that is included in your App.xaml. This style sets the visibility to collapsed when the tooltip is an empty string or 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>

Also include sys namespace (for String.Empty):

xmlns:sys="clr-namespace:System;assembly=mscorlib"


One way you can do that is wrap the ToolTip in a Rectangle and give it a Transparent color. Then you just set the Visibility to Collapsed on this Rectangle.

Update:

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


This is a WPF answer (haven't tried it in Silverlight).

Use ToolTipService.IsEnabled, and bind it to the tooltip property. Then use a converter to convert the tooltip string to a bool.

For example, I have the following:

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

Or in code-behind

ToolTipService.SetIsEnabled(textBlock, false);


I was having the same issue as I was setting value to String.Empty. Setting it to null solves the problem.

WinRT/Windows 8 App XAML


If just using the default tooltip I would otherwise recommend either setting the bound value to null in the viewmodel or using a converter whenever the item is empty.

In my case I've got a:

public string Name { get; }

Bound using:

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

Where the idea is to show the full name in the tooltip if cut of due to lack of width. In my viewmodel I simply:

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

At least in .Net 4.0 this will not show a tooltip for me.


Strangely, none of these answers worked in my case. A reply to the top answer alludes to it - if you're ToolTip is related to a TextBlock then that solution won't work. I have a TextBlock within a DataGridTemplateColumn.CellTemplate element, and I just bound the text directly to the ToolTip property of the TextBlock like this:

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

And I ended up getting the desired behavior (hidden tooltip when text is empty) "for free".


You could create a converter from string to bool that returns false if the string length is 0 and true otherwise, then bind ToolTip.Active to TooltipInformation with that converter.

0

精彩评论

暂无评论...
验证码 换一张
取 消