应用开发中经常会需要根据显示区域的宽度来决定能显示字符的个数,但受字符不同、字体不同、字号不同的影响,这个个数又无法固定。怎么办呢?这就需要我们去测量每个字符在实际显示中所占的宽度,然后和可显示宽度做比较来判断最终显示的字符。
那么如何测量字符的显示宽度呢? 
Win API中提供了GetTextMetrics方法。

WinForm中提供了Graphics.MeasureString,通过Reflector能看到MeasureString最终也是通过调用gdiplus.dll来完成的:

[DllImport("gdiplus.dll", CharSet=CharSet.Unicode, SetLastError=true, ExactSpelling=true)]
internal static extern int GdipMeasureString(HandleRef graphics, string textString, int length, HandleRef font, ref GPRECTF layoutRect, HandleRef stringFormat, [In, Out] ref GPRECTF boundingBox, out int codepointsFitted, out int linesFilled);

但WPF中既没有HDC,也没有Graphics,只有一个DrawingContext.显然想用API来搞定是不可能的了。

不过还好WPF中很多涉及字符显示的控件,像TextBlock、FormattedText都提供了Trimming属性,只需要将Trimming属性,设置为:Trimming.CharacterEllipsis或Trimming.WordEllipsis,就可以实现自动根据最大可显示宽度裁剪你的字符串并附加上"..."。

有些人估计看到这儿估计想骂我了:“大哥,你啰啰嗦嗦扯了这么多,不会就是想告诉我们WPF中TextBlock等控件具有自动裁剪功能吧”.

好吧,要不是因为TextBlock并不能完成我的需求,估计只能写到这了。

我的字符串:"xxxxxxxxxxx(123)",我希望的裁剪效果是:"xxxxx...(123)",而TextBlock只能整成这个样子:"xxxxxxxx..."。

不过既然TextBlock实现了裁剪的功能,咱们又有强大的Reflector,那接下来的任务是不是很简单了。

事实告诉我,一点也不简单,靠, MS 那帮龟孙子们写的代码可读性太差了。云里雾里最后终于找到一个叫"GlyphRun”的类,查MSDN:

GlyphRun Class
Represents a sequence of glyphs from a single face of a single font at a single size, and with a single rendering style.

而且还给配了一副很牛X的图:

感觉离目标不远了,接着就发现了GlyphTypeface 类,GlyphTypeface提供了两个集合属性:

CharacterToGlyphMap,获取某个字符在“font CMAP table” 中对应的glyph索引

AdvanceWidths,根据glyph索引,获取某个字符的轮廓(glyph)宽度,实际宽度还要乘以字符大小。

原来每个字符的轮廓宽度早在“font CMAP table"约定好了,至于"font CMAP table”是什么,感兴趣的朋友自己去Google吧

demo源码下载地址:http://files.cnblogs.com/gboxcc/wpf_trim_string.zip

转载于:https://www.cnblogs.com/gboxcc/archive/2009/02/06/wpf_string_trim_glyphtypeface.html

[WPF]根据显示区域宽度裁剪字符串相关推荐

  1. html自动裁剪图片宽度,html - CSS显示调整大小和裁剪的图像

    html - CSS显示调整大小和裁剪的图像 我想显示具有一定宽度和高度的URL中的图像,即使它具有不同的大小比例.所以我想调整大小(保持比例),然后将图像剪切到我想要的大小. 我可以用html ba ...

  2. 【物联网智能网关-08】TinyGUI和WPF汉字显示技术比较

    TinyGUI是我在2010上半年的时候,基于.NET Micro Framework系统开发的一个轻量级图形库,虽然TinyGUI运行需要的资源少,运行快,但是不支持汉字显示(如需显示汉字还是必须借 ...

  3. html 背景区域设置,HTML5 背景的显示区域实现

    background-clip 属性规定背景的绘制区域. 默认值:  border-box 继承性:  no 版本:  css3 javascript 语法:  object.style.backgr ...

  4. 《Photoshop Lightroom4 经典教程》—第2课2.5节使用主显示区域

    本节书摘来自异步社区<Photoshop Lightroom4 经典教程>一书中的第2课2.5节使用主显示区域,作者[美]Adobe公司,更多章节内容可以访问云栖社区"异步社区& ...

  5. uniapp开发微信小程序,多行文本换行,动态改变文字区域宽度

    需求:商品标题部分超出两行显示- 且当点击编辑显示选择按钮后,文字区域宽度变小后,文字不能溢出. 如图: HTML代码 <!-- 收藏 --> <view class="g ...

  6. typora修改主题字体、代码块字体、行内块代码字体大小、引用块字体大小、代码块背景颜色、文章可写区域宽度以及修改教程

    目录 0. 授人以渔 1.主题字体 2.代码块字体大小 3.引用块字体大小 4.代码块背景颜色 ①pink老师的样式代码 ②自己搜到的样式 5.块代码字体大小 6.修改文章可写区域的宽度 0. 授人以 ...

  7. 两步轻松搞定 编辑器上传图片尺寸过大 超出前台显示区域问题!

    用户在编辑器中随意上传图片,难免会遇到图片宽度超出前台显示区域,严重影响页面展示美观度.... 两步搞定方法: 1.书写在内容显示区域DIV中控制img标签最大宽度. 2.js清除用户设定宽度. 问题 ...

  8. wpf 字体模糊_WPF:解决WPF文字显示不清晰初探

    可能WPF太耀眼了,大家都一直在讨论它的光芒,我也是其中的一员. 当发现它给软件界面设计带来的革命性变化时,说服同事,在新项目中使用了WPF这一新技术. 无奈,项目快结束时,头头验收时说字体模糊,不能 ...

  9. uniapp图片自适应显示,不裁剪

    先看图: 这是长图和方图的显示效果,都可以完全显示出来 上代码: html部分: <view class="question-title" style="width ...

最新文章

  1. hadoop作业初始化过程详解(源码分析第三篇)
  2. byte与char区别
  3. redis启动异常处理一例
  4. 设计模式学习(二): 观察者模式 (C#)
  5. c位边上还有什么位_c位是什么意思?明星站c位旁边是什么位?有什么含义【图】...
  6. Bootstrap3 模态对话框的事件
  7. Atiitt 技术部的基本发展战略 attilax总结 艾龙 著 1. 战略的解释,即是 大概纲领与方法 1 2. 技术的基本战略是,培训,吸收与改造,recos,预研,技术储备 1 2.1.
  8. Jmeter教程(图文版)
  9. VC打印机使用 win95环境的下例子测试
  10. WizTree v4.03 最快的磁盘空间分析工具中文便携版
  11. python实现 stft_Python中的可逆STFT和ISTFT
  12. 电脑弹窗广告太多了,程序员电脑为什么没有弹窗,那是你没打开这个设置
  13. 关于程序员的那些段子,你能看懂几个?
  14. Mac环境下安装hadoop
  15. HC-02蓝牙串口模块的配置和使用
  16. 想要通过炒币财富自由?先看看这篇文章吧!
  17. OpenGL进阶(十九) - 多光源
  18. 2022.01.19 - SX10-23.零钱兑换
  19. 餐饮SaaS行进时:美团To B,二维火To C
  20. Oracle建表不设主键,oracle建表,设置主键,修改属性等

热门文章

  1. 【云周刊】第120期:麒麟来了!PUE逼近1.0,阿里展示液冷黑科技
  2. Spring Board View
  3. CSU 1027 Smallbox魔方
  4. python文件生成电脑exe文件
  5. C++11新特性(3)
  6. java vector内存结构_4. Java集合知识测试
  7. python调用hive与java调用区别_python和hive结合使用
  8. 印尼商品期货交易监管局考虑对加密货币交易征税
  9. 《经济学人》报道Tether:在纽约被监管机构罚款
  10. 12月中国区块链经理人指数:环比出现大幅下跌 企业融资不理想