6

.NET 中是否有任何自动修剪路径字符串的方法?

例如:

C:\Documents and Settings\nick\My Documents\Tests\demo data\demo data.emx

变成

C:\Documents...\demo data.emx

如果它被内置到 Label 类中会特别酷,我似乎记得它是——虽然找不到它!

4

5 回答 5

9

TextRenderer.DrawTextTextFormatFlags.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()继承标签中的方法。感谢您分享您的最终解决方案。

于 2008-08-21T16:49:29.640 回答
4

@lubos hasko你的代码是 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);
于 2008-08-21T17:23:39.933 回答
3

写自己虽然不难:

    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;
        }
    }

我想您甚至可以将其添加为扩展方法。

于 2008-08-21T16:49:06.630 回答
0

你在标签上的想法是它会放......如果它比宽度长(未设置为自动大小),但那将是

c:\Documents and Settings\nick\My Doc...

如果有支持,它可能在 System.IO 中的 Path 类上

于 2008-08-21T16:48:58.003 回答
0

您可以使用 System.IO.Path.GetFileName 方法并将该字符串附加到缩短的 System.IO.Path.GetDirectoryName 字符串。

于 2008-08-21T16:49:01.310 回答