题
.NET 中有没有自动修剪路径字符串的方法?
例如:
C:\Documents and Settings\nick\My Documents\Tests\demo data\demo data.emx
变成
C:\Documents...\demo data.emx
如果将其内置到 Label 类中,那就特别酷了,我似乎记得它是——但找不到它!
解决方案
使用 文本渲染器.DrawText 和 TextFormatFlags.PathEllipsis 旗帜
void label_Paint(object sender, PaintEventArgs e)
{
Label label = (Label)sender;
TextRenderer.DrawText(e.Graphics, label.Text, label.Font, label.ClientRectangle, label.ForeColor, TextFormatFlags.PathEllipsis);
}
你的代码已经完成了 95%。唯一的问题是,修剪的文本是在标签上已经存在的文本顶部绘制的。
是的,谢谢,我知道这一点。我的目的只是为了演示使用 DrawText
方法。我不知道你是想为每个标签手动创建事件还是只是覆盖 OnPaint()
继承标签中的方法。不过,感谢您分享您的最终解决方案。
其他提示
@ 卢博斯哈斯科 你的代码已经完成了 95%。唯一的问题是修剪后的文本绘制在标签上已有文本的顶部。这很容易解决:
Label label = (Label)sender;
using (SolidBrush b = new SolidBrush(label.BackColor))
e.Graphics.FillRectangle(b, label.ClientRectangle);
TextRenderer.DrawText(
e.Graphics,
label.Text,
label.Font,
label.ClientRectangle,
label.ForeColor,
TextFormatFlags.PathEllipsis);
不过自己写也不难:
public static string TrimPath(string path)
{
int someArbitaryNumber = 10;
string directory = Path.GetDirectoryName(path);
string fileName = Path.GetFileName(path);
if (directory.Length > someArbitaryNumber)
{
return String.Format(@"{0}...\{1}",
directory.Substring(0, someArbitaryNumber), fileName);
}
else
{
return path;
}
}
我想你甚至可以将它添加为扩展方法。
您在标签上的想法是它会放...如果它比宽度长(未设置为自动大小),但那就是
c:\Documents and Settings\nick\My Doc...
如果有支持,可能会在 System.IO 中的 Path 类上
您可以使用 System.IO.Path.GetFileName 方法并将该字符串附加到缩短的 System.IO.Path.GetDirectoryName 字符串中。
不隶属于 StackOverflow