Exibição do caminho no rótulo
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!
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.