如果绑定为空,则隐藏工具提示
Posted
技术标签:
【中文标题】如果绑定为空,则隐藏工具提示【英文标题】:Hide tooltip if binding is null 【发布时间】:2011-08-20 03:21:17 【问题描述】:目前我有以下代码来显示工具提示。
<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 或空字符串,有没有办法完全删除工具提示?
【问题讨论】:
【参考方案1】:您可以做到这一点的一种方法是将ToolTip
包裹在Rectangle
中,并给它一个Transparent
颜色。然后你只需在这个Rectangle
上将Visibility
设置为Collapsed
。
更新:
<Border Background="#FFE45F5F">
<Grid>
<TextBlock Text="Binding Property1"/>
<Rectangle Fill="Transparent" Visibility="Binding Property2, Converter=StaticResource BooleanToVisibilityConverter" ToolTipService.ToolTip="Binding TooltipInformation"/>
</Grid>
</Border>
【讨论】:
尝试包装一个新边框,其中包含工具提示服务和堆栈面板中的文本块。然后将绑定添加到一个检查字符串是否为空的布尔值。使用 booltovisibile 转换器将该布尔值绑定到新边界的可见性。但它没有做任何事情。事实上,它禁用了每个工具提示:) 您好,请查看我的更新答案。您实际上不需要另一个面板,只需使用 Rectangle 来触发 ToolTip 的隐藏/显示。 :)【参考方案2】:您可以创建一个从字符串到布尔的转换器,如果字符串长度为 0,则返回 false,否则返回 true,然后使用该转换器将 ToolTip.Active 绑定到 TooltipInformation。
【讨论】:
ToolTip.Active 在当前上下文中不可用。【参考方案3】:为所有控件隐藏空工具提示的一种方法是在 App.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 命名空间(用于 String.Empty):
xmlns:sys="clr-namespace:System;assembly=mscorlib"
【讨论】:
完美。如果可以的话,我会给你远远超过 +1 silverlight 中没有触发器。 这是最好的答案。 如果Content
是一个 UI 元素,则不起作用,例如TextBlock
.
添加 BasedOn="StaticResource x:Type ToolTip
以避免破坏现有样式(例如来自主题)【参考方案4】:
如果只使用默认工具提示,我建议要么在视图模型中将绑定值设置为 null,要么在项目为空时使用转换器。
就我而言,我有一个:
public string Name get;
绑定使用:
<TextBlock Text="Binding Name" TextTrimming="CharacterEllipsis" Tooltip="Binding Name" />
如果由于缺少宽度而被剪切,想法是在工具提示中显示全名。在我的视图模型中,我只是:
if (string.IsNullOrEmpty(Name)) Name = null;
至少在 .Net 4.0 中,这不会为我显示工具提示。
【讨论】:
【参考方案5】:我在为 String.Empty 设置值时遇到了同样的问题。将其设置为 null 即可解决问题。
WinRT/Windows 8 应用 XAML
【讨论】:
【参考方案6】:这是一个 WPF 答案(尚未在 Silverlight 中尝试过)。
使用 ToolTipService.IsEnabled,并将其绑定到工具提示属性。然后使用转换器将工具提示字符串转换为布尔值。
例如,我有以下内容:
<TextBlock x:Name="textBlock" ToolTipService.IsEnabled="Binding EntryToolTip, Converter=StaticResource StringNullOrEmptyToBoolConverter">
...
</TextBlock>
或在代码隐藏中
ToolTipService.SetIsEnabled(textBlock, false);
【讨论】:
+1 这对我有用,更适合我们的应用程序。我们可能在许多不同类型的控件中提供了数十个工具提示,因此样式仍然是多余的。此外,我们在某些地方(但不是其他地方)有专门的工具提示。这种方法允许以单一方式说“摆脱空白”,我们可以在任何地方使用。以上是关于如果绑定为空,则隐藏工具提示的主要内容,如果未能解决你的问题,请参考以下文章