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

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

6 голосов
/ 21 августа 2008

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

Например:

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

становится

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

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

Ответы [ 5 ]

9 голосов
/ 21 августа 2008

Использовать TextRenderer.DrawText с TextFormatFlags.PathEllipsis flag

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() в унаследованной метке. Спасибо, что поделились своим окончательным решением.

4 голосов
/ 21 августа 2008

@ 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);
3 голосов
/ 21 августа 2008

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

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

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

0 голосов
/ 21 августа 2008

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

0 голосов
/ 21 августа 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...