2008-08-21 62 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);