不截断单词的自动换行





5.00/5 (4投票s)
这是“不截断单词的自动换行”的替代方案。
引言
这是对 不截词的自动换行 的一种替代方案。它使用 string.Split
和 LINQ 简化了代码(尽管我也提供了一个非 LINQ 版本以供比较)。它还将单词换行功能分离为静态类中的扩展方法。最后,我包含了一个 WinForms 应用程序来演示代码。
背景
基本思想是将一行文本(字符串)换行以适应给定的宽度,仅在单词边界处断行,这里单词边界定义为“空格分隔”。然而,一个单词本身长度超过给定宽度的情况则存在歧义。(a) 将单词拆分以适应宽度,或者 (b) 允许超过宽度的单个单词。我决定提供一个可选参数来选择所需的行为。
使用 string.Split()
降低了表观复杂度(尤其是在允许超宽单词的简单情况下),并避免了在拆分时逐字符重新处理。
此外,为了不依赖 WinForms 的 TextRenderer
和 Font
类,该实现接受一个 delegate
(Predicate<string>
),用于测试字符串是否“合适”。调用者可以自由地通过任何所需的方式确定是否合适。
string input = "This is the test string, with some veeerrrryyy looooong words!";
int wrapWidth = 160; // determined somehow
// font below determined from some source
Predicate<string> stringFits = s => TextRenderer.MeasureText(s, font).Width < wrapWidth;
string Ret = input.WordWrap(stringFits, false); // do NOT allow overwide words
// If you will always allow oversize words, then the bool is not required:
string Ret = input.WordWrap(stringFits); // do allow overwide words
关注点
存在 WordWrapNonLinq()
方法,它们实现了相同的功能,而无需使用 Linq 的 .Aggregate()
方法。(这展示了 .Aggregate()
实际的作用。)
历史
初始版本。