Visualizzazione del percorso nell'etichetta
Domanda
Esistono metodi automatici per tagliare una stringa di percorso in .NET?
Per esempio:
C:\Documents and Settings\nick\My Documents\Tests\demo data\demo data.emx
diventa
C:\Documents...\demo data.emx
Sarebbe particolarmente interessante se fosse integrato nella classe Label, e mi sembra di ricordare che lo sia, però non riesco a trovarlo!
Soluzione
Utilizzo TextRenderer.DrawText con TextFormatFlags.PathEllipsis bandiera
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);
}
Il tuo codice è lì al 95%.L'unico problema è che il testo tagliato viene disegnato sopra il testo che è già sull'etichetta.
Sì grazie, ne ero a conoscenza.La mia intenzione era solo quella di dimostrare l'uso di DrawText
metodo.Non sapevo se vuoi creare manualmente un evento per ciascuna etichetta o semplicemente sovrascriverlo OnPaint()
metodo nell'etichetta ereditata.Grazie comunque per aver condiviso la tua soluzione finale.
Altri suggerimenti
@ lubos hasko Il tuo codice è lì al 95%.L'unico problema è che il testo ritagliato viene disegnato sopra il testo già presente sull'etichetta.Questo è facilmente risolvibile:
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);
Non è difficile scriverti tu stesso però:
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;
}
}
Immagino che potresti anche aggiungerlo come metodo di estensione.
Quello a cui stai pensando sull'etichetta è che metterà...se è più lungo della larghezza (non impostato sulla dimensione automatica), ma lo sarebbe
c:\Documents and Settings\nick\My Doc...
Se fosse presente supporto, probabilmente si troverebbe nella classe Path in System.IO
È possibile utilizzare il metodo System.IO.Path.GetFileName e aggiungere la stringa a una stringa System.IO.Path.GetDirectoryName abbreviata.