Скрыть всплывающую подсказку, если привязка равна нулю

#c# #silverlight #xaml #binding #tooltip

#c# #silverlight #xaml #привязка #всплывающая подсказка

Вопрос:

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

 <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 пикселей в ширину). Даже если я установлю для видимости текстового блока значение collapsed.

Есть ли способ полностью удалить всплывающую подсказку, если значение TooltipInformation равно null или является пустой строкой?

Ответ №1:

Один из способов скрыть пустую всплывающую подсказку для всех элементов управления — создать стиль в словаре ресурсов, который включен в ваше приложение.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 (для строки.Пусто):

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

Комментарии:

1. Идеальный. Я бы дал вам значительно больше, чем 1, если бы мог

2. в silverlight нет триггеров.

3. Это лучший ответ.

4. Не работает, если Content является элементом пользовательского интерфейса, например TextBlock .

5. добавьте BasedOn="{StaticResource {x:Type ToolTip}} , чтобы избежать нарушения существующих стилей (например, из тем)

Ответ №2:

Один из способов сделать это — обернуть 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>
  

Комментарии:

1. Попробовал обернуть новую границу со службой всплывающих подсказок внутри нее и текстовым блоком в stackpanel. Затем добавьте привязку к логическому значению, которое проверяет, является ли строка пустой или нет. Привязать это логическое значение к видимости новой границы с помощью преобразователя booltovisibile. Но это ничего не дало. Фактически, это отключило все всплывающие подсказки 🙂

2. Привет, пожалуйста, посмотрите мой обновленный ответ. На самом деле вам не нужна другая панель, просто используйте прямоугольник, чтобы вызвать скрытие / отображение всплывающей подсказки. 🙂

Ответ №3:

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

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

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

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

Или в коде за

 ToolTipService.SetIsEnabled(textBlock, false);
  

Комментарии:

1. 1 У меня это сработало и лучше подходит для нашего приложения. У нас потенциально есть десятки всплывающих подсказок для многих различных типов элементов управления, поэтому стилизация все равно была бы избыточной. Кроме того, в некоторых местах у нас есть специализированные всплывающие подсказки (но не в других). Этот подход допускает единственный способ сказать «избавиться от пробелов», который мы можем использовать везде.

Ответ №4:

У меня возникла та же проблема, что и при установке значения в строку.Пусто. Установка для нее значения null решает проблему.

WinRT / Windows 8 App XAML

Ответ №5:

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

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

 public string Name { get; }
  

Привязка с использованием:

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

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

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

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

Ответ №6:

Как ни странно, ни один из этих ответов не сработал в моем случае. Ответ на верхний ответ ссылается на это — если ваша всплывающая подсказка связана с текстовым блоком, то это решение не будет работать. У меня есть текстовый блок внутри DataGridTemplateColumn.Элемент CellTemplate, и я просто привязал текст непосредственно к свойству ToolTip текстового блока следующим образом:

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

И в итоге я получил желаемое поведение (скрытая всплывающая подсказка, когда текст пуст) «бесплатно».

Ответ №7:

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

Комментарии:

1. Всплывающая подсказка. Active недоступен в текущем контексте.