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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top