【问题标题】:How do I implement word wrap?如何实现自动换行?
【发布时间】:2016-09-06 20:38:26
【问题描述】:

XNA 有Spritefont 类,它有一个MeasureString 方法,可以返回string 的Width 和Height。我试图了解如何创建一个方法,该方法将有效地返回一个在正确位置插入Environment.Newline 的字符串,以便如果适合某个宽度和高度(矩形用作该参数)。

【问题讨论】:

  • 我找到了这个XNA Word Wrapping。另一个线程有一些code
  • @AlinaB。谢谢,这实际上解决了我的问题!您应该从该页面发布代码作为答案,以防 wiki 消失。答案属于你。

标签: c# xna word-wrap spritefont measurestring


【解决方案1】:

我找到了以下代码:XNA - Basic Word Wrapping

public string WrapText(SpriteFont spriteFont, string text, float maxLineWidth)
{
    string[] words = text.Split(' ');
    StringBuilder sb = new StringBuilder();
    float lineWidth = 0f;
    float spaceWidth = spriteFont.MeasureString(" ").X;

    foreach (string word in words)
    {
        Vector2 size = spriteFont.MeasureString(word);

        if (lineWidth + size.X < maxLineWidth)
        {
            sb.Append(word + " ");
            lineWidth += size.X + spaceWidth;
        }
        else
        {
            sb.Append("\n" + word + " ");
            lineWidth = size.X + spaceWidth;
        }
    }

    return sb.ToString();
}

【讨论】:

    【解决方案2】:

    为了补充 Alina 的答案,这里是该函数的扩展版本,它也会对长度超过 maxLineWidth 的单个单词进行换行

        public static string WrapText(SpriteFont font, string text, float maxLineWidth)
        {
            string[] words = text.Split(' ');
            StringBuilder sb = new StringBuilder();
            float lineWidth = 0f;
            float spaceWidth = font.MeasureString(" ").X;
    
            foreach (string word in words)
            {
                Vector2 size = font.MeasureString(word);
    
                if (lineWidth + size.X < maxLineWidth)
                {
                    sb.Append(word + " ");
                    lineWidth += size.X + spaceWidth;
                }
                else
                {
                    if (size.X > maxLineWidth)
                    {
                        if (sb.ToString() == "")
                        {
                            sb.Append(WrapText(font, word.Insert(word.Length / 2, " ") + " ", maxLineWidth));
                        }
                        else
                        {
                            sb.Append("\n" + WrapText(font, word.Insert(word.Length / 2, " ") + " ", maxLineWidth));
                        }
                    }
                    else
                    {
                        sb.Append("\n" + word + " ");
                        lineWidth = size.X + spaceWidth;
                    }
                }
            }
    
            return sb.ToString();
        }
    

    【讨论】:

      【解决方案3】:

      要处理带有回车的文本块,您需要修改代码如下:

        public static string WrapText(SpriteFont font, string text, float maxLineWidth)
          {
              string[] words = text.Split(' ');
              StringBuilder sb = new StringBuilder();
              float lineWidth = 0f;
              float spaceWidth = font.MeasureString(" ").X;
      
              foreach (string word in words)
              {
                  Vector2 size = font.MeasureString(word);
      
                  if (word.Contains("\r"))
                  {
                      lineWidth = 0f;
                      sb.Append("\r \r" );
                  }
      
                  if (lineWidth + size.X < maxLineWidth )
                  {
                      sb.Append(word + " ");
                      lineWidth += size.X + spaceWidth;
                  }
      
                  else
                  {
                      if (size.X > maxLineWidth )
                      {
                          if (sb.ToString() == " ")
                          {
                              sb.Append(WrapText(font, word.Insert(word.Length / 2, " ") + " ", maxLineWidth));
                          }
                          else
                          {
                              sb.Append("\n" + WrapText(font, word.Insert(word.Length / 2, " ") + " ", maxLineWidth));
                          }
                      }
                      else
                      {
                          sb.Append("\n" + word + " ");
                          lineWidth = size.X + spaceWidth;
                      }
                  }
              }
      
              return sb.ToString();
          }
      

      【讨论】:

      • 感谢修改它工作得很好,但为什么sb.Append("\r \r"); 部分?它只是在单词之间添加了双空格,为什么不是sb.Append("\r"); (没有多余的空格也一样,至少在我检查的示例中)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2019-12-15
      相关资源
      最近更新 更多