Word用多行包裹一个字符串

For*_*Why 37 c# word-wrap

我试图将一个字符串换成多行.每一行都有定义的宽度.

例如,如果我将其包装到宽度为120像素的区域,我会得到这个结果.

Lorem ipsum dolor坐下来,
精致的adipistur elit.Sed augue
velit,tempor non vulputate sit amet,
dictum vitae lacus.简历中
说,justo,sem.Donec
pulvinar,nisi nec sagittis consequat,
sem orci luctus velit,sed elementum
ligula ante nec neque.Pellentesque
居民morbi tristique senectus et
netus et malesuada fames ac turpis
egestas.Etiam erat est,pellentesque
eget tincidunt ut,egestas in ante.
Nulla vitae vulputate velit.
Proin in congue neque.Cras rut​​rum sodales sapien
,ut convallis erat auctor vel.
Duis ultricies pharetra dui,sagittis
varius mauris tristique a.Nam ut
neque id risus tempor hendrerit.
Maecenas ut lacus nunc.Nulla
fermentum ornare rhoncus.Nulla
gravida vestibulum odio,vel commodo
magna condimentum quis.Quisque
sollicitudin blandit英里,无杂色山雀
自由人lobortis欧盟.
Vestibulum eu turpis massa,id tincidunt orci.
Curabitur pellentesque urna non
risus adipiscing facilisis.Mauris vel
accumsan purus.
Proin quis enim nec sem tempor vestibulum ac vitae augue.

as-*_*cii 39

static void Main(string[] args)
{
    List<string> lines = WrapText("Add some text", 300, "Calibri", 11);

    foreach (var item in lines)
    {
        Console.WriteLine(item);
    }

    Console.ReadLine();
}

static List<string> WrapText(string text, double pixels, string fontFamily, 
    float emSize)
{
    string[] originalLines = text.Split(new string[] { " " }, 
        StringSplitOptions.None);

    List<string> wrappedLines = new List<string>();

    StringBuilder actualLine = new StringBuilder();
    double actualWidth = 0;

    foreach (var item in originalLines)
    {
        FormattedText formatted = new FormattedText(item, 
            CultureInfo.CurrentCulture, 
            System.Windows.FlowDirection.LeftToRight,
            new Typeface(fontFamily), emSize, Brushes.Black);

        actualLine.Append(item + " ");
        actualWidth += formatted.Width;

        if (actualWidth > pixels)
        {
            wrappedLines.Add(actualLine.ToString());
            actualLine.Clear();
            actualWidth = 0;
        }
    }

    if(actualLine.Length > 0)
        wrappedLines.Add(actualLine.ToString());

    return wrappedLines;
}
Run Code Online (Sandbox Code Playgroud)

添加WindowsBasePresentationCore库.


小智 5

这是我为XNA游戏提出的一个版本......

(请注意,它是一个片段,而不是正确的类定义.享受!)

using System;
using System.Text;
using Microsoft.Xna.Framework.Graphics;

public static float StringWidth(SpriteFont font, string text)
{
    return font.MeasureString(text).X;
}

public static string WrapText(SpriteFont font, string text, float lineWidth)
{
    const string space = " ";
    string[] words = text.Split(new string[] { space }, StringSplitOptions.None);
    float spaceWidth = StringWidth(font, space),
        spaceLeft = lineWidth,
        wordWidth;
    StringBuilder result = new StringBuilder();

    foreach (string word in words)
    {
        wordWidth = StringWidth(font, word);
        if (wordWidth + spaceWidth > spaceLeft)
        {
            result.AppendLine();
            spaceLeft = lineWidth - wordWidth;
        }
        else
        {
            spaceLeft -= (wordWidth + spaceWidth);
        }
        result.Append(word + space);
    }

    return result.ToString();
}
Run Code Online (Sandbox Code Playgroud)