Frage

Gibt es automatische Methoden zum Kürzen einer Pfadzeichenfolge in .NET?

Zum Beispiel:

C:\Documents and Settings\nick\My Documents\Tests\demo data\demo data.emx

wird

C:\Documents...\demo data.emx

Es wäre besonders cool, wenn dies in die Label-Klasse integriert wäre, und ich glaube mich zu erinnern, dass es so ist – ich kann es allerdings nicht finden!

War es hilfreich?

Lösung

Verwenden TextRenderer.DrawText mit TextFormatFlags.PathEllipsis Flagge

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);
}

Ihr Code ist zu 95 % vorhanden.Das einzige Problem ist, dass der geschnittene Text über den bereits auf dem Etikett befindlichen Text gezeichnet wird.

Ja danke, das war mir bewusst.Meine Absicht war nur, die Verwendung von zu demonstrieren DrawText Methode.Ich wusste nicht, ob Sie für jedes Label manuell ein Ereignis erstellen oder es einfach überschreiben möchten OnPaint() Methode im geerbten Label.Vielen Dank, dass Sie uns Ihre endgültige Lösung mitgeteilt haben.

Andere Tipps

@ lubos hasko Ihr Code ist zu 95 % vorhanden.Das einzige Problem besteht darin, dass der zugeschnittene Text über dem bereits auf dem Etikett befindlichen Text gezeichnet wird.Das lässt sich leicht lösen:

    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);

Allerdings ist es nicht schwer, selbst zu schreiben:

    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;
        }
    }

Ich denke, Sie könnten es sogar als Erweiterungsmethode hinzufügen.

Was Sie auf dem Etikett denken, ist, dass es ...wenn es länger als die Breite ist (nicht auf automatische Größe eingestellt), aber das wäre so

c:\Documents and Settings\nick\My Doc...

Wenn es Unterstützung gibt, würde es sich wahrscheinlich um die Path-Klasse in System.IO handeln

Sie können die Methode „System.IO.Path.GetFileName“ verwenden und diese Zeichenfolge an eine verkürzte Zeichenfolge „System.IO.Path.GetDirectoryName“ anhängen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top