Affichage du chemin dans l'étiquette
Question
Existe-t-il des méthodes automatiques pour couper une chaîne de chemin dans .NET ?
Par exemple:
C:\Documents and Settings\nick\My Documents\Tests\demo data\demo data.emx
devient
C:\Documents...\demo data.emx
Ce serait particulièrement cool si cela était intégré à la classe Label, et je crois me rappeler que c'est le cas - je ne le trouve cependant pas !
La solution
Utiliser TextRenderer.DrawText avec TextFormatFlags.PathEllipsis drapeau
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);
}
Votre code est là à 95%.Le seul problème est que le texte coupé est dessiné sur le haut du texte qui est déjà sur l'étiquette.
Oui merci, j'en étais conscient.Mon intention était uniquement de démontrer l'utilisation de DrawText
méthode.Je ne savais pas si vous souhaitiez créer manuellement un événement pour chaque étiquette ou simplement remplacer OnPaint()
méthode dans l’étiquette héritée.Merci d'avoir partagé votre solution finale.
Autres conseils
@ Lubos Hasko Votre code est là à 95%.Le seul problème est que le texte tronqué est dessiné par-dessus le texte qui figure déjà sur l'étiquette.Ceci est facilement résolu :
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);
Pas difficile de s'écrire cependant :
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;
}
}
Je suppose que vous pourriez même l'ajouter comme méthode d'extension.
Ce que vous pensez sur l'étiquette, c'est qu'elle mettra...s'il est plus long que la largeur (non défini sur la taille automatique), mais ce serait
c:\Documents and Settings\nick\My Doc...
S'il existe un support, ce serait probablement sur la classe Path dans System.IO
Vous pouvez utiliser la méthode System.IO.Path.GetFileName et ajouter cette chaîne à une chaîne System.IO.Path.GetDirectoryName raccourcie.