如果需要,显示 WPF 工具提示
Posted
技术标签:
【中文标题】如果需要,显示 WPF 工具提示【英文标题】:Show WPF Tooltip if needed 【发布时间】:2010-11-10 02:20:20 【问题描述】:我在有限大小的控件中有一个 TextBlock。如果文本太长而无法放入控件,我想显示一个带有全文的工具提示。这是您肯定从许多应用程序中知道的经典行为。
我尝试使用转换器将 TextBlock 宽度转换为 Tooltip 的可见性。
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="Binding Text">
<TextBlock.ToolTip>
<ToolTip
DataContext="TemplateBinding Content"
Visibility="Binding Converter=StaticResource visConvert">
<TextBlock Text="Binding Text"></TextBlock>
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
</DataTemplate>
</GridViewColumn.CellTemplate>
问题在于转换器中:
public object Convert(object value, ...
'value' 是 DataBound 项。我希望“值”是 TextBlock,观察其宽度,并将其与 GridViewColumn.Width 进行比较。
【问题讨论】:
【参考方案1】:我想通了,Tooltip 具有 PlacementTarget 属性,该属性指定具有 Tooltip 的 UI 元素。万一有人需要:
<TextBlock Text="Binding Text">
<TextBlock.ToolTip>
<ToolTip
DataContext="Binding Path=PlacementTarget, RelativeSource=x:Static RelativeSource.Self"
Visibility="Binding Converter=StaticResource toolVisConverter">
<TextBlock Text="Binding Text"/> <!-- tooltip content -->
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
然后编写一个将TextBlock转换为Visibility的Converter(基于TextBlock的宽度)。
【讨论】:
我认为Visibility="Binding Converter=StaticResource toolVisConverter"
不是必需的。【参考方案2】:
好的,那么为什么要采用仅限 XAML 的硬方式呢?这有效:
<TextBlock Text="Binding Text"
IsMouseDirectlyOverChanged="TextBlock_IsMouseDirectlyOverChanged" >
<TextBlock.ToolTip>
<ToolTip Visibility="Collapsed">
<TextBlock Text="Binding Text"></TextBlock>
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
在 Control.xaml.cs 中:
private void TextBlock_IsMouseDirectlyOverChanged(object sender, DependencyPropertyChangedEventArgs e)
bool isMouseOver = (bool)e.NewValue;
if (!isMouseOver)
return;
TextBlock textBlock = (TextBlock)sender;
bool needed = textBlock.ActualWidth >
(this.listView.View as GridView).Columns[2].ActualWidth;
((ToolTip)textBlock.ToolTip).Visibility =
needed ? Visibility.Visible : Visibility.Collapsed;
【讨论】:
这在启用 TextTrimming 的情况下是否有效?因为这样 TextBlock 可能不会占用比可用空间更多的空间。【参考方案3】:我认为您必须查看 ControlTemplate 触发器才能解决此问题。不幸的是,ControlTemplate 触发器总是与特定值进行比较,不小于或大于。你可以让它出现,例如如果 Width = 100,而不是 Width
【讨论】:
以上是关于如果需要,显示 WPF 工具提示的主要内容,如果未能解决你的问题,请参考以下文章
为啥 WPF 样式在工具提示中显示验证错误适用于文本框但对组合框无效?