写一个给字符串根据长度添加换行符的处理方法
在控件处理时,当需要显示的字符串过长时,我们需要自己处理字符串,添加换行符,从而使控件在指定宽度中完全显示。例如聊天记录显示,提一下datagridview中的换行,iswarp什么属性只对数字/字母自动换行,不支持中文自动换行,所以,有时候也需要提前处理一下。
我选择为string类型添加扩展方法,使用方法如下:
public static string ConvertToStringCanFillInWidth(this string content,Font font,int limitWidth) { return new NewlineStringConverter(content, font, limitWidth).Convert(); }
将处理方法封成一个类。一方面是隐藏处理逻辑,还有一方面是将参数保存为对象字段,避免方法之间的参数传递。
处理类:
本来想通过二分法来找到每行的索引的,对算法还是不熟,花了一些时间还是没想好怎么处理,于是就一个个迭代来算了。在处理之前我将字符串中的换行符都移除掉了。
internal class NewlineStringConverter { Font font; int limitWidth; string content; StringBuilder returnStringBuilder; public NewlineStringConverter(string content,Font font,int limitWidth) { this.content = RemoveNewlineCharacter(content); this.font = font; this.limitWidth = limitWidth; returnStringBuilder = new StringBuilder(); } public string Convert() { if (IsValid()) { ProcessContent(); } return returnStringBuilder.ToString(); } void ProcessContent() { if (IsNeedNewline()) { for (int i = 1; i < content.Length; i++) { if (CaculateStringLength(content.Substring(0, i + 1)) > limitWidth) { returnStringBuilder.Append(content.Substring(0, i)); returnStringBuilder.AppendLine(); content = content.Substring(i); ProcessContent(); } } } else returnStringBuilder.Append(content); } private static string RemoveNewlineCharacter(string content) { return content.Replace("\r", "").Replace("\n", ""); } bool IsValid() { if (font == null || string.IsNullOrEmpty(content) || CaculateStringLength(content[0].ToString()) > limitWidth) return false; return true; } bool IsNeedNewline() { if (CaculateStringLength(content) > limitWidth) return true; return false; } int CaculateStringLength(string caculateString) { return TextRenderer.MeasureText(caculateString,font).Width; } }
最后测试一下效果,测试代码:
static void Main(string[] args) { TestNewlineMethod(); Console.ReadKey(); } static void TestNewlineMethod() { string testContent = "sdasad爱神的箭阿三客户等级啊可是大家开始搭建啊手机打开激动撒看见很多撒撒娇电话卡票iOS大批"; Console.WriteLine("newLine --> \r\n" + testContent.ConvertToStringCanFillInWidth(Control.DefaultFont,20)); }
结果如下: