前言

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

通常,我们使用ToolTip最简单的方式是这样:

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

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

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

这很好理解,如果TextBlock足以显示所有文本内容,那么显示Tooltip显然是多此一举的事情。但UWP并没有对这种常见的情况进行自动处理,比如将TextBlock在文本溢出时自动显示Tooltip作为一个默认行为,所以我们就需要自己来实现这个操作。


思路

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

但在实际创建的时候,我发现这很难做到,原因如下:

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

综上,在查找一些资料后,我决定改造一下Converter本身。

解决方法

Converter

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的值。

使用

<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有多种实现方式,我只提出了一种,以供参考。

【UWP】仅在TextBlock文本溢出时显示Tooltip的更多相关文章

  1. CSS 文本溢出时显示省略标记

    如标题所示... <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.o ...

  2. css 文本溢出时显示省略号

    .text-ellipsis { width:100px; height:60px; overflow: hidden;//隐藏滚动条 text-overflow:ellipsis; white-sp ...

  3. HTML技巧篇:如何让单行文本以及多行文本溢出时显示省略号(…)

    参考:https://baijiahao.baidu.com/s?id=1621362934713048315&wfr=spider&for=pc 本篇文章主要给大家介绍一下在html ...

  4. text-overflow文本溢出隐藏“...”显示

    一.文本溢出省略号显示 1.文本溢出是否“...”显示属性:text-overflow:clip(不显示省略标记)/ellipsis(文本溢出时“...”显示) 定义此属性有四个必要条件:1)须有容器 ...

  5. CSS---解决内容过多就会出文本溢出(显示在区域外面,不换行的情况)

    当我们设置我的的div,或者其它文本框固定宽度之后,文本内容过多就会出文本溢出(显示在区域外面,不换行的情况). 这时我们可以使用Css中的几个属于来解.有以下的三个属于可以解决问题: 1,word- ...

  6. Linux vi 文本代码时显示行号或不显示行号

    Linux vi 文本代码时显示行号或不显示行号 前提  安装了vim $vi ~/.vimrc 显示的话加上 set nu 不想显示的话可以注释掉 "set nu 之后 $source ~ ...

  7. css实现文本溢出用...显示

    文本溢出省略号显示,要实现这个必须 要有四个条件: 1.须有容器宽度:width:value 2.强制文本在一行内显示:white-space:nowrap: 3.溢出内容隐藏:overflow:hi ...

  8. css文本溢出隐藏显示省略号(单行+多行)

    文本超出若干行就换行,这个功能几乎每个文本浏览网站都会用到,实现它的办法也有很多,今天简单的介绍一下实现它的方法.  一. 单行文本不换行,并将超出文本隐藏 .box-content{     ove ...

  9. #CSS 文本溢出部分显示省略号

    单行结尾溢出: 用text-overflow:ellipsis属性实现,当然还需要加宽度width属来兼容部分浏览. width:300px;overflow: hidden; text-overfl ...

随机推荐

  1. vue bus.js 使用方法

    1 ,新建bus.js 内容如下 2,bus.$emit 绑定数据 bus.$emit('tags', this.tagsList); 第一个参数为定义的变量,第二个为集合数据 3, 监听数据 bus ...

  2. JavaSE-知识点总结

    Java名词 变量.运算符.类.接口.枚举.参数.注解.异常.包装类.多线程.集合.IO流.网络编程.反射.Lambda.API 源文件:.java文件,存储Java源代码的文件 字节码文件:.cla ...

  3. AI行业精选日报_人工智能(12·20)

    IDC:中国智能家居市场2020年十大预测 12 月 20 日消息,「IDC 咨询」官方公众号发布「中国智能家居 2020 年十大预测」.具体内容如下:互联平台加速整合.语音助手广泛赋能.智能电视显著 ...

  4. SpringCloud-使用熔断器仪表盘监控熔断

    场景 SpringCloud-使用熔断器防止服务雪崩-Ribbon和Feign方式(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...

  5. JS---DOM/BOM---学习road map---7 parts

    JS---DOM/BOM---学习road map---6 parts Part 1-2: Part 3-4 part 5-7:

  6. Cocos Creator 资源加载流程剖析【五】——从编辑器到运行时

    我们在编辑器中看到的资源,在构建之后会进行一些转化,本章将揭开Creator对资源进行的处理. 资源处理的整体规则 首先我们将Creator的开发和运行划分为以下几个场景: 编辑器 当我们将资源放到编 ...

  7. 关于Redis 二进制内容的 可视化尝试

    二进制内容的 能否可视化?  网上的资料比较少啊! -------------------------------------------------------------------------- ...

  8. SSM框架之SpringMVC(5)文件上传

    SpringMVC(5)文件上传 1.实现文件上传的前期准备 1.1.文件上传的必要前提 A form 表单的 enctype 取值必须是: multipart/form-data(默认值是:appl ...

  9. jsf中的按钮加弹框的两种形式

    第一种: <p:commandButton value="一键移除" action="#{ProjectPackageManageBackingBean.remov ...

  10. Server基本语句的用法

    1.创建数据库 create database databaseName use databaseName go   /*  转到指定数据库 */ 2.创建表 create table tableNa ...