Отображение пути в Метке
Вопрос
Существуют ли какие-либо автоматические методы для обрезки строки пути в .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.