Скрыть подсказку, если привязка пуста - PullRequest
30 голосов
/ 06 мая 2011

В настоящее время у меня есть следующий код для отображения всплывающей подсказки.

<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 или пустой строке?

Ответы [ 6 ]

93 голосов
/ 16 декабря 2011

Один из способов скрыть пустую подсказку для всех элементов управления - создать стиль в словаре ресурсов, который включен в ваш App.xaml. Этот стиль устанавливает видимость свернутой, когда всплывающая подсказка представляет собой пустую строку или ноль:

<!-- 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"
16 голосов
/ 06 мая 2011

Один из способов сделать это - обернуть ToolTip в Rectangle и придать ему Transparent цвет. Затем вы просто устанавливаете Visibility на Collapsed на этом Rectangle.

Обновление:

<Border Background="#FFE45F5F">
    <Grid>
        <TextBlock Text="{Binding Property1}"/>
        <Rectangle Fill="Transparent" Visibility="{Binding Property2, Converter={StaticResource BooleanToVisibilityConverter}}" ToolTipService.ToolTip="{Binding TooltipInformation}"/>
    </Grid>
</Border>
4 голосов
/ 25 сентября 2017

Это ответ WPF (еще не пробовал в Silverlight).

Используйте ToolTipService.IsEnabled и привяжите его к свойству всплывающей подсказки.Затем используйте конвертер для преобразования строки подсказки в bool.

Например, у меня есть следующее:

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

Или в коде позади

ToolTipService.SetIsEnabled(textBlock, false);
1 голос
/ 29 декабря 2014

У меня была та же проблема, что и при установке значения в String.Empty. Установка его в ноль решает проблему.

WinRT / Windows 8 App XAML

0 голосов
/ 26 августа 2014

Если бы просто использовать всплывающую подсказку по умолчанию, в противном случае я бы порекомендовал либо установить для привязанного значения значение null в viewmodel, либо использовать конвертер, когда элемент пуст.

В моем случае у меня есть:

public string Name { get; }

Связывается с помощью:

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

Где идея состоит в том, чтобы показать полное имя во всплывающей подсказке, если вырезание вызвано отсутствием ширины.В моей модели представления я просто:

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

По крайней мере, в .Net 4.0 это не покажет подсказку для меня.

0 голосов
/ 06 мая 2011

Вы можете создать преобразователь из строки в bool, который возвращает false, если длина строки равна 0, и true в противном случае, а затем связать ToolTip.Active с TooltipInformation с этим преобразователем.

...