65.9K
CodeProject 正在变化。 阅读更多。
Home

不截断单词的自动换行

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2012 年 6 月 6 日

CPOL

1分钟阅读

viewsIcon

27508

downloadIcon

796

这是“不截断单词的自动换行”的替代方案。

Screen image of demo application

引言

这是对 不截词的自动换行 的一种替代方案。它使用 string.Split 和 LINQ 简化了代码(尽管我也提供了一个非 LINQ 版本以供比较)。它还将单词换行功能分离为静态类中的扩展方法。最后,我包含了一个 WinForms 应用程序来演示代码。

背景

基本思想是将一行文本(字符串)换行以适应给定的宽度,仅在单词边界处断行,这里单词边界定义为“空格分隔”。然而,一个单词本身长度超过给定宽度的情况则存在歧义。(a) 将单词拆分以适应宽度,或者 (b) 允许超过宽度的单个单词。我决定提供一个可选参数来选择所需的行为。

使用 string.Split() 降低了表观复杂度(尤其是在允许超宽单词的简单情况下),并避免了在拆分时逐字符重新处理。

此外,为了不依赖 WinForms 的 TextRendererFont 类,该实现接受一个 delegatePredicate<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() 实际的作用。)

历史

初始版本。

© . All rights reserved.