【UWP】仅在TextBlock文本溢出时显示Tooltip

前言

这是我今天在回答SO问题时偶然遇到的,以为可能还比较通用,就记录下来以供参考。设计

一般,咱们使用ToolTip最简单的方式是这样:code

<TextBlock Text="Test"
           ToolTipService.ToolTip="Test"
           />

这样在光标悬浮在TextBlock上方时,会显示一个提示条,可是这彷佛又违背了一个设计原则:xml

ToolTip做为提示,应该仅在当前内容显示不全,且用户有意愿查看完整内容时做为替代元素出现对象

这很好理解,若是TextBlock足以显示全部文本内容,那么显示Tooltip显然是画蛇添足的事情。但UWP并无对这种常见的状况进行自动处理,好比将TextBlock在文本溢出时自动显示Tooltip做为一个默认行为,因此咱们就须要本身来实现这个操做。ip


思路

我能想到的思路是借助TextBlock.IsTextTrimmed属性,在True的时候设置Tooltip的值为TextBlock.Text,在False的时候设置Tooltip的值为nullget

但在实际建立的时候,我发现这很难作到,缘由以下:string

  1. Converter的ConverterParameter属性是一个简单对象(object),没法经过绑定进行传值(只有DependencyProperty才能使用绑定),这意味着我没法在绑定IsTextTrimmed的同时经过ConverterParameter属性传入Text的值
  2. 我也不能直接在Converter内绑定TextBlock自己,目标太大,而我只想要IsTextTrimmed属性改变时进行判断.

综上,在查找一些资料后,我决定改造一下Converter自己。io

解决方法

Converterclass

public class TrimConverter : DependencyObject, IValueConverter
{
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), typeof(TrimConverter), new PropertyMetadata(""));


    public object Convert(object value, Type targetType, object parameter, string language)
    {
        bool isTrim = System.Convert.ToBoolean(value);
        return isTrim ? Text : null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

我在Converter内部建立了一个DependencyProperty用来存放TextBlock.Text的值。object

使用

<Page.Resources>
    <local:TrimConverter x:Key="TrimConverter" Text="{Binding ElementName=TestBlock,Path=Text}"/>
</Page.Resources>

...
<TextBlock MaxWidth="100" TextTrimming="CharacterEllipsis"
           x:Name="TestBlock"
           ToolTipService.ToolTip="{Binding ElementName=TestBlock, 
                                            Path=IsTextTrimmed,
                                            Converter={StaticResource TrimConverter}}"/>

在XAML界面中完成绑定后,实测能够解决个人需求。

可是这个解决方法并不完美,它有一个问题:

和TextBlock自己耦合,因为Text值须要绑定,只能一个TextBlock建立一个Converter,不可以复用


实现在TextBlock文本溢出时显示Tooltip有多种实现方式,我只提出了一种,以供参考。

相关文章
相关标签/搜索