这是我今天在回答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
的值为null
。get
但在实际建立的时候,我发现这很难作到,缘由以下:string
ConverterParameter
属性是一个简单对象(object),没法经过绑定进行传值(只有DependencyProperty
才能使用绑定),这意味着我没法在绑定IsTextTrimmed
的同时经过ConverterParameter
属性传入Text的值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有多种实现方式,我只提出了一种,以供参考。