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 !

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top