I'm trying to position my tooltip so that it would be on the bottom and center of my target object. I can position it to be just on the bottom by ToolTipService.Postion="Bottom"
, but how to position it to be also on the center?
Asked
Active
Viewed 7,667 times
1 Answers
24
I agree, the options available for positioning a ToolTip
are a little limited. I think you'll have to combine Placement="Bottom"
with HorizontalOffset
to get Bottom/Center positioning.
To center the ToolTip
relative to the PlacementTarget
you can use
(PlacementTarget.ActualWidth / 2.0) - (ToolTip.ActualWidth / 2.0)
Example
<Button Content="Test">
<Button.ToolTip>
<ToolTip Content="ToolTip Text"
Placement="Bottom">
<ToolTip.HorizontalOffset>
<MultiBinding Converter="{StaticResource CenterToolTipConverter}">
<Binding RelativeSource="{RelativeSource Self}" Path="PlacementTarget.ActualWidth"/>
<Binding RelativeSource="{RelativeSource Self}" Path="ActualWidth"/>
</MultiBinding>
</ToolTip.HorizontalOffset>
</ToolTip>
</Button.ToolTip>
</Button>
CenterToolTipConverter
public class CenterToolTipConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.FirstOrDefault(v => v == DependencyProperty.UnsetValue) != null)
{
return double.NaN;
}
double placementTargetWidth = (double)values[0];
double toolTipWidth = (double)values[1];
return (placementTargetWidth / 2.0) - (toolTipWidth / 2.0);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
If you need to center several ToolTips
you could use a Style
like
<Style x:Key="centeredToolTip" TargetType="ToolTip">
<Setter Property="HorizontalOffset">
<Setter.Value>
<MultiBinding Converter="{StaticResource CenterToolTipConverter}">
<Binding RelativeSource="{RelativeSource Self}" Path="PlacementTarget.ActualWidth"/>
<Binding RelativeSource="{RelativeSource Self}" Path="ActualWidth"/>
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
<!-- ... -->
<Button Content="Test">
<Button.ToolTip>
<ToolTip Style="{StaticResource centeredToolTip}"
Placement="Bottom"
Content="ToolTip Text"/>
</Button.ToolTip>
</Button>

Fredrik Hedblad
- 83,499
- 23
- 264
- 266
-
Nice Fredrik. But how did you arrive at that formula ? (placementTargetWidth / 2.0 - tooltipwidth / 2.0). In my case I am using Popup and i want to point Popup's arrow head to target. which will require a negative horizontaloffset value. your formula will not yield in most cases. – Purohit Hitesh Aug 06 '19 at 06:35
-
I had to change the result calculation of the converter to `return (toolTipWidth / 2.0) - (placementTargetWidth / 2.0);` Otherwise, the tooltip was not centered. – ToastedSoul Dec 14 '20 at 10:40