Search code examples
wpfxamlbindingstylestooltip

define a ToolTip Style that hides a tooltip if Converter(ToolTip) returns fale


I want to hide empty ToolTips

this is what worked up to a certain Point:

  <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>

Problem is: Trigger only operates on null or string.IsEmpty I want to catch whitespace tooltips as well.

so I tried:

  <Style TargetType="ToolTip">
    <Setter Property="Visibility">
      <Setter.Value>
        <Binding >   <!------------ what comes here? -->
          <Binding.Converter>
            <loc:NotEmptyToVisibilityConverterEx/>
          </Binding.Converter>
        </Binding>
      </Setter.Value>
    </Setter>
  </Style>

My Problem is, I'm not able to (dunno how) access the actual tooltip text.

  [ValueConversion(typeof(string), typeof(Visibility))]
  public class NotEmptyToVisibilityConverterEx : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
      var visible = !string.IsNullOrEmpty(((string) value).Trim());
      return visible ? Visibility.Visible : Visibility.Collapsed;
    }
  }

Anybody have an idea?


Solution

  • This should work:

    <Window x:Class="HideEmptyToolTipsWithTrigger.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:HideEmptyToolTipsWithTrigger"
            xmlns:system="clr-namespace:System;assembly=mscorlib"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <local:EmptyToolTipToBooleanConverter x:Key="EmptyToolTipToBooleanConverter" />
    
            <Style TargetType="ToolTip">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Content, RelativeSource={RelativeSource Self}, Converter={StaticResource EmptyToolTipToBooleanConverter}}" Value="True">
                        <Setter Property="Visibility" Value="Collapsed" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Window.Resources>
    
        <StackPanel>
            <TextBlock Text="This TextBlock has ToolTip" ToolTip="Almafa"></TextBlock>
    
            <TextBlock Text="This TextBlock has ToolTip with whitespaces" ToolTip="     "></TextBlock>
    
            <TextBlock Text="This TextBlock has ToolTip with empty string" ToolTip="{x:Static system:String.Empty}"></TextBlock>
        </StackPanel>
    </Window>
    

    And the converter:

    public class EmptyToolTipToBooleanConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var contentAsString = value as string;
    
            if (contentAsString != null)
            {
                return string.IsNullOrEmpty(contentAsString.Trim());
            }
            else
            {
                return false;
            }
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    Note that a ToolTip can have any custom content, not just a string. For example:

    <TextBlock Text="This TextBlock has a complex ToolTip">
        <TextBlock.ToolTip>
            <StackPanel>
                <TextBlock Text="First line"></TextBlock>
                <TextBlock Text="Second line"></TextBlock>
            </StackPanel>
        </TextBlock.ToolTip>
    </TextBlock>
    

    This converter shows these tooltips.