2008-08-21 53 views
6

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

例如:

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

成为

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

这将是特别凉爽,如果这是建立在标签类,并且我似乎记得它是 - 不容找到它虽然!

回答

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()方法。感谢您分享您的最终解决方案。

0

你在想什么的标签上是它将把...如果它比宽度(未设置自动大小)更长的时间,但是这将是

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

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

0

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

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

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

3

@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);