How to position tooltip bottom center

后端 未结 1 876
夕颜
夕颜 2020-12-09 12:15

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.Posti

相关标签:
1条回答
  • 2020-12-09 12:38

    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>
    
    0 讨论(0)
提交回复
热议问题