Show WPF Tooltip if needed
I figured it out, the Tooltip has PlacementTarget property that specifies the UI element that has the Tooltip. In case anyone needs it:
<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>
And then write a Converter that converts TextBlock to Visibility (based on TextBlock width).
Ok, so why do it the hard XAML-only way? This works:
<TextBlock Text="{Binding Text}" IsMouseDirectlyOverChanged="TextBlock_IsMouseDirectlyOverChanged" > <TextBlock.ToolTip> <ToolTip Visibility="Collapsed"> <TextBlock Text="{Binding Text}"></TextBlock> </ToolTip> </TextBlock.ToolTip></TextBlock>
in 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;}
I would think you have to look at a ControlTemplate trigger to solve this problem. Unfortunately ControlTemplate triggers always compare with a specific value, not less than or greater than. You can make it appear e.g. if the Width = 100, not Width < 100.