Pergunta

Existem métodos automáticos para cortar uma string de caminho no .NET?

Por exemplo:

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

torna-se

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

Seria particularmente legal se isso fosse incorporado à classe Label, e parece que me lembro que é - mas não consigo encontrar!

Foi útil?

Solução

Usar TextRenderer.DrawText com TextFormatFlags.PathEllipsis bandeira

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

Seu código está 95% aí.O único problema é que o texto aparado é desenhado sobre o texto que já está no rótulo.

Sim, obrigado, eu estava ciente disso.Minha intenção foi apenas demonstrar o uso de DrawText método.Não sabia se você deseja criar eventos manualmente para cada rótulo ou apenas substituir OnPaint() método no rótulo herdado.Obrigado por compartilhar sua solução final.

Outras dicas

@ lubos hasko Seu código está 95% aí.O único problema é que o texto recortado é desenhado sobre o texto que já está na etiqueta.Isso é facilmente resolvido:

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

Não é difícil escrever você mesmo:

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

Eu acho que você poderia até adicioná-lo como um método de extensão.

O que você está pensando no rótulo é que ele vai colocar...se for maior que a largura (não definido para tamanho automático), mas isso seria

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

Se houver suporte, provavelmente estaria na classe Path em System.IO

Você pode usar o método System.IO.Path.GetFileName e anexar essa string a uma string System.IO.Path.GetDirectoryName abreviada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top