我在一个有限大小的控件中有一个TextBlock。如果文本太长而无法放入控件中,我想显示带有全文的工具提示。这是许多应用程序中您肯定知道的经典行为。
我尝试使用Converter将TextBlock宽度转换为Tooltip的Visibility。
<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项。我希望'value'是TextBlock,观察它的宽度,并将它与GridViewColumn.Width进行比较。
答案 0 :(得分:30)
我想通了,工具提示有 PlacementTarget 属性,指定具有工具提示的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(基于TextBlock宽度)。
答案 1 :(得分:4)
好的,那么为什么选择硬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;
}
答案 2 :(得分:0)
我认为您必须查看ControlTemplate触发器才能解决此问题。不幸的是,ControlTemplate触发器总是与特定值进行比较,不小于或大于。你可以让它出现,例如如果宽度= 100,则不是宽度&lt; 100。