使用 .NET Framework 使用省略号缩短路径字符串






4.95/5 (18投票s)
使用内置的 .NET Framework API 压缩路径或任何字符串
引言
还记得 Windows API PathCompactPath[Ex] 曾经可以接收一个路径,并通过在适当的位置插入省略号来缩短它,使其适应特定的像素宽度吗? 曾经想过如何在原生 .NET 中实现它吗? 使用 TextRenderer.MeasureText
方法有一种非常简单的方法,但它的文档相对较少。
背景
如果您熟悉这个问题,您可能已经知道可以使用 Windows.Forms.TextRenderer.DrawText
或 Drawing.Graphics.DrawString
方法以编程方式绘制缩短的字符串,从而使用框架。 但我想要一种检索内存中缩短字符串的方法,以便稍后将该字符串用于现有的控件(例如菜单项)中。
Using the Code
这是一个执行此操作的简单函数,我会在内部复制字符串(以防止影响源字符串),调用 Windows.Forms.TextRenderer.MeasureText
并使用神奇的按位参数:TextFormatFlags.ModifyString
,然后返回传递到函数的字符串变量。
Function CompactString(ByVal MyString As String, ByVal Width As Integer,
ByVal Font As Drawing.Font,
ByVal FormatFlags As Windows.Forms.TextFormatFlags) As String
Dim Result As String = String.Copy(MyString)
TextRenderer.MeasureText(Result, Font, New Drawing.Size(Width, 0),
FormatFlags Or TextFormatFlags.ModifyString)
Return Result
End Function
要将标签设置为字符串路径的压缩版本,您将调用
Label1.Text = CompactString(MyPath, Label1.Width, Label1.Font,
TextFormatFlags.PathEllipsis)
例如,字符串:c:\program files\test app\runme.exe 可能会变成
c:\program files\...\runme.exe 具体取决于字体和宽度。
查看 Windows.Forms.TextFormatFlags
枚举类型,了解有关如何压缩字符串的其他选项。 例如,TextFormatFlags.WordEllipsis
会在字符串末尾插入“...”而不是在路径的各个部分之间。
关注点
您可能会想,为什么不自己编写一个算法来分解字符串并在某个位置插入省略号呢? 事实上,我见过程序员这样做,但我建议使用框架来处理这个问题,原因有几个
- 为什么重复造轮子? 微软已经完成了它,并且可能经过了充分的测试和优化; 您真的有额外的时间吗?
- 如果放置省略号的标准发生变化怎么办? 也许有一天省略号通常会插入在驱动器号之后,而不是在文件名之前。 让 MS 考虑这些细节,并遵循他们的指导。 如果 MS 在内部更改此实现,您的应用程序将自动随之改变。