Pregunta

¿Existen métodos automáticos para recortar una cadena de ruta en .NET?

Por ejemplo:

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

se convierte

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

Sería particularmente interesante si esto estuviera integrado en la clase Etiqueta, y creo recordar que así es, ¡aunque no puedo encontrarlo!

¿Fue útil?

Solución

Usar 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 está al 95% allí.El único problema es que el texto recortado se dibuja en la parte superior del texto que ya está en la etiqueta.

Si gracias, ya lo sabía.Mi intención era sólo demostrar el uso de DrawText método.No sabía si desea crear un evento manualmente para cada etiqueta o simplemente anularlo. OnPaint() método en etiqueta heredada.Gracias por compartir tu solución final.

Otros consejos

@ lubos hasko Su código está al 95% allí.El único problema es que el texto recortado se dibuja encima del texto que ya está en la etiqueta.Esto se soluciona 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);

Aunque no es difícil escribirlo tú mismo:

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

Supongo que incluso podrías agregarlo como método de extensión.

Lo que estás pensando en la etiqueta es que pondrá…si es más largo que el ancho (no configurado en tamaño automático), pero eso sería

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top