Я хотел обернуть текст, чтобы потом нарисовать его на своем изображении.Я попробовал ответ от @ as-cii, но в моем случае это не сработало, как ожидалось.Он всегда расширяет заданную ширину моей линии (возможно, потому что я использую ее в сочетании с объектом Graphics для рисования текста в моем изображении).Кроме того, его ответ (и связанные с ним) просто работают для> .Net 4 фреймворков.В рамках .Net 3.5 отсутствует функция Clear () для StringBuilder объектов.Итак, вот отредактированная версия:
public static List<string> WrapText(string text, double pixels, string fontFamily, float emSize)
{
string[] originalWords = text.Split(new string[] { " " },
StringSplitOptions.None);
List<string> wrappedLines = new List<string>();
StringBuilder actualLine = new StringBuilder();
double actualWidth = 0;
foreach (string word in originalWords)
{
string wordWithSpace = word + " ";
FormattedText formattedWord = new FormattedText(wordWithSpace,
CultureInfo.CurrentCulture,
System.Windows.FlowDirection.LeftToRight,
new Typeface(fontFamily), emSize, System.Windows.Media.Brushes.Black);
actualLine.Append(wordWithSpace);
actualWidth += formattedWord.Width;
if (actualWidth > pixels)
{
actualLine.Remove(actualLine.Length - wordWithSpace.Length, wordWithSpace.Length);
wrappedLines.Add(actualLine.ToString());
actualLine = new StringBuilder();
actualLine.Append(wordWithSpace);
actualWidth = 0;
actualWidth += formattedWord.Width;
}
}
if (actualLine.Length > 0)
wrappedLines.Add(actualLine.ToString());
return wrappedLines;
}
Поскольку я работаю с графическим объектом, я попробовал решение @Thorins.Это сработало для меня намного лучше, так как правильно оборачивает текст.Но я внес некоторые изменения, чтобы вы могли дать методу необходимые параметры.Также была ошибка: последняя строка не была добавлена в список, когда не было выполнено условие блока if в цикле for.Таким образом, вы должны добавить эту строку позже.Отредактированный код выглядит так:
public static List<string> WrapTextWithGraphics(Graphics g, string original, int width, Font font)
{
List<string> wrappedLines = new List<string>();
string currentLine = string.Empty;
for (int i = 0; i < original.Length; i++)
{
char currentChar = original[i];
currentLine += currentChar;
if (g.MeasureString(currentLine, font).Width > width)
{
// exceeded length, back up to last space
int moveback = 0;
while (currentChar != ' ')
{
moveback++;
i--;
currentChar = original[i];
}
string lineToAdd = currentLine.Substring(0, currentLine.Length - moveback);
wrappedLines.Add(lineToAdd);
currentLine = string.Empty;
}
}
if (currentLine.Length > 0)
wrappedLines.Add(currentLine);
return wrappedLines;
}