我有一个包含字符串的数组,我想知道如何取一个字符串并以指定的像素长度剪掉一部分并将其添加到数组中。
例如,
string[] string1 = { "Hello World" };
我正在使用XNA,因此我可以使用
获取像素长度FontName.MeasureString(string1[0]).Length()
因此,例如,如果上面的代码返回100像素长,我怎么能切割70像素长的字符串并将其添加回数组以获得这个:
string1 = { "Hello Wo", "rld" } // Hello Wo(100px), rld(30px)
我已经看过使用StringBuilder,但它会测量字符长度的字符串。如果没有可能的方法来实现这一点,是否有办法找出字符串的开头和我希望字符串切断的像素点之间有多少个字符,那么我就是能够使用StringBuilder。
编辑:
所以我尝试循环遍历数组,然后循环遍历数组中的每个字符并将其添加到列表中,它有点起作用,但是在将它添加回数组之后我无法继续它。
string[] stringArray = { "Hello World" };
List<Char> charList = new List<Char>();
List<Char> charList2 = new List<Char>();
List<String> stringList = new List<String>();
for (int i = 0; i < stringArray.Length; i++)
{
if ((int)consolas.MeasureString(stringArray[i]).Length() > 30)
{
for (int c = 0; c < stringArray[i].Length; c++)
{
if (consolas.MeasureString(string.Join("", charList)).Length() < 30)
{
charList.Add(stringArray[i][c]);
}
else
{
charList2.Add(stringArray[i][c]);
}
}
}
}
stringList.Add(string.Join("", charList));
stringList.Add(string.Join("", charList2));
stringArray = stringList.ToArray();
charList.Clear();
charList2.Clear();
stringList.Clear();
上面的代码返回
stringArray = { "He", "llo World" };
这是我想要的,但我希望它继续这样做
stringArray = { "He", "ll", "o World" };
并在通过30px时继续分割字符串。我已经考虑过了,我似乎无法理解为什么它不会进一步分裂。
答案 0 :(得分:0)
在MSDN上找到了这个。看起来它对你有用;
private void MeasureStringMin(PaintEventArgs e)
{
// Set up string.
string measureString = "Measure String";
Font stringFont = new Font("Arial", 16);
// Measure string.
SizeF stringSize = new SizeF();
stringSize = e.Graphics.MeasureString(measureString, stringFont);
// Draw rectangle representing size of string.
e.Graphics.DrawRectangle(new Pen(Color.Red, 1), 0.0F, 0.0F, stringSize.Width, stringSize.Height);
// Draw string to screen.
e.Graphics.DrawString(measureString, stringFont, Brushes.Black, new PointF(0, 0));
}
方法页面:https://msdn.microsoft.com/en-us/library/system.drawing.graphics.measurestring(v=vs.110).aspx
答案 1 :(得分:0)
我做了一个逻辑模型,使用替换检查字符串长度,而不是像素长度。应该相当清楚如何在测量函数中替换它。
(替代的限制是我没有测试x太短但x + 1太长的情况。所以测试一下!)
我对性能没有任何要求。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
string[] stringArray = { "333", "Hello World", "A", "World gone mad and society has, too" };
List<string> newStrings = new List<string> ();
foreach (string currentString in stringArray)
{
bool finished = false;
int start = 0;
int end = 0;
while (!finished)
{
if (currentString.Length == end)
{
finished = true;
newStrings.Add(currentString.Substring(start, end - start));
}
else if (Measure(currentString.Substring(start, end - start)) == 0)
{
newStrings.Add(currentString.Substring(start, end - start));
start = end;
}
else if (Measure(currentString.Substring(start, end-start)) < 0)
{
end++;
}
else //adding one more made it too long
{
end--;
newStrings.Add(currentString.Substring(start, end - start));
start = end;
}
}
}
foreach (string s in newStrings)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
private static int Measure(string s)
{
//you would check using something like
//int length = ((int)consolas.MeasureString(stringArray[i]).Length());
//int requiredValue = 30;
//but I have substituted just plain string.Length to show the logic
int length = s.Length;
int requiredValue = 3;
if (length == requiredValue) return 0;
if (length < requiredValue) return -1;
return 1;
}
}
}