Вопрос

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

Например:

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

становится

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

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

Это было полезно?

Решение

Использование TextRenderer.Нарисуйте текст с Теги текстового формата.ПатоЭллипсис Отметить

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

Другие советы

@ любош хаско Ваш код там на 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);

Хотя написать самому не так уж трудно:

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top