Отображение пути в метке

Существуют ли автоматические методы для обрезки строки пути в .NET?

Например:

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

становится

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

Было бы особенно здорово, если бы это было встроено в класс Label, и я, кажется, вспомнил, что это так - не могу найти его, хотя!

21.08.2008 16:38:29
5 ОТВЕТОВ
РЕШЕНИЕ

Используйте TextRenderer.DrawText с флагом TextFormatFlags.PathEllipsis

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

Ваш код там 95%. Единственная проблема заключается в том, что обрезанный текст рисуется поверх текста, который уже находится на ярлыке.

Да, спасибо, я знал об этом. Моим намерением было только продемонстрировать использование DrawTextметода. Я не знал, хотите ли вы вручную создать событие для каждой метки или просто переопределить OnPaint()метод в унаследованной метке. Спасибо, что поделились своим окончательным решением.

9
11.08.2012 15:57:48

На этикетке вы думаете, что она будет помещена ... если она длиннее ширины (не установлена ​​на автоматический размер), но это будет

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

Если есть поддержка, она, вероятно, будет в классе Path в System.IO

0
21.08.2008 16:48:58

Вы можете использовать метод System.IO.Path.GetFileName и добавить эту строку в сокращенную строку System.IO.Path.GetDirectoryName.

0
21.08.2008 16:49:01

Не трудно написать самому, хотя:

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

Я думаю, вы могли бы даже добавить его в качестве метода расширения.

3
21.08.2008 16:49:06

@ lubos hasko Твой код там 95%. Единственная проблема заключается в том, что обрезанный текст рисуется поверх текста, который уже находится на ярлыке. Это легко решается:

    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);
4
23.05.2017 12:33:27