2008-08-21 8 views
6

¿Hay algún método automático para recortar una cadena de ruta en .NET?Visualización de ruta en la etiqueta

Por ejemplo:

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

convierte

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

En particular, sería genial si este se construye en la clase Label, y me parece recordar que es - no puedo encontrarlo ¡aunque!

Respuesta

9

Uso TextRenderer.DrawText con TextFormatFlags.PathEllipsis bandera

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

Su código es 95% allí. El único problema es que el texto recortado es dibujado sobre el texto que es ya en la etiqueta.

Sí, gracias, era consciente de eso. Mi intención era solo demostrar el uso del método DrawText. No sabía si desea crear eventos manualmente para cada etiqueta o simplemente anular el método OnPaint() en la etiqueta heredada. Gracias por compartir tu solución final.

0

Lo que usted está pensando en la etiqueta es que va a poner ... si es más largo que el ancho (no ajustado en tamaño automático), pero eso sería

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

Si hay un apoyo, probablemente estaría en la clase Path en System.IO

0

Puede usar el método System.IO.Path.GetFileName y anexar esa cadena a una cadena System.IO.Path.GetDirectoryName acortada.

3

No es difícil escribir usted mismo sin embargo:

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

Creo que se puede incluso agregar como un método de extensión.

3

@lubos hasko Su código es 95% allí. El único problema es que el texto recortado se dibuja sobre el texto que ya está en la etiqueta. Esto se resuelve fácilmente:

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); 
Cuestiones relacionadas