How do I implement word wrap?

前端 未结 3 681
走了就别回头了
走了就别回头了 2021-01-14 02:31

XNA has Spritefont class, which has a MeasureString method, which can return the Width and Height of a string. I\'m trying to understand how to create a method

相关标签:
3条回答
  • 2021-01-14 02:52

    I found following code: 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();
    }
    
    0 讨论(0)
  • 2021-01-14 02:57

    To add to Alina's answer, here is an extended version of that function, that will also linebreak single words that are longer than 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();
        }
    
    0 讨论(0)
  • 2021-01-14 03:01

    To handle a block of text with carriage returns you need to modify the code as below:

      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();
        }
    
    0 讨论(0)
提交回复
热议问题