#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 недоступен в текущем контексте.