如何在 .NET 中使用列表
如何在 .NET 中使用列表
Word 文档中的编号和项目符号列表由三个协同对象构成:List,可重用的编号定义;ListFormat,用于指示特定段落所属的列表及其层级;以及 ListLevel,保存单个层级的实际格式。本指南展示了如何将列表应用于段落、如何防止不同列表共享计数器、如何在层级之间移动段落,以及如何使用 Aspose.Words FOSS for .NET 定制编号和项目符号的格式。
分步指南
步骤 1:将列表应用于段落
在段落的格式上使用 ListFormat.ApplyBulletDefault() 或 ApplyNumberDefault() 可以一次性应用 Word 的默认项目符号或编号列表——这是应用标准列表的最快方式。若需使用特定的预定义格式而非默认格式,请调用 Document.Lists(一个 ListCollection).Add(listTemplate),并提供 ListTemplate 值,例如 BulletDisk、BulletSquare、NumberArabicDot 或 NumberUppercaseRomanDot,以从 Word 的内置格式创建 List,或使用 AddSingleLevelList(listTemplate) 创建单层变体。段落获得列表格式后,ListFormat.IsListItem 会报告 true,而 ListFormat.List/ListLevelNumber 则标识其使用的列表及层级。
步骤 2:为新的一组段落分配独立的编号
段落的ListFormat.List指向相同的共享List对象时,会继续使用相同的计数器。当需要对一组新段落进行独立的从1重新编号时,调用ListCollection.AddCopy(srcList)来复制现有的列表定义,然后将复制品应用到新段落,而不是重复使用原始定义。ListCollection.GetListByListId(listId)通过其ListId检索特定列表,以便在需要查找而不是创建时使用,Count则报告文档当前拥有的列表数量。
步骤 3:在列表层级之间移动段落
使用ListFormat.ListIndent()将段落向下移动一级到其列表中,使用ListOutdent()将其向上移动一级——这与 Word 在列表段落开头使用 Tab 和 Shift+Tab 的操作相同。相比直接设置ListLevelNumber,更推荐使用这些方法,因为它们能够保持段落的列表格式在内部的一致性。调用RemoveNumbers()可以完全去除段落的列表格式。
步骤 4:自定义列表层级的编号格式
通过List.ListLevels(一个ListLevelCollection)访问特定层级,然后一起设置ListLevel.NumberStyle(一个NumberStyle值,例如Arabic、UppercaseRoman、LowercaseLetter或Bullet)和NumberFormat——将数字与句点或括号等文字组合的格式字符串——因为不匹配会导致意外的渲染。StartAt设置该层级的起始编号,RestartAfterLevel控制哪个更高层级的递增会重新启动此层级的计数器——在嵌套列表中应显式设置,而不是依赖默认的重新启动行为。Alignment(Left、Center、Right)和TrailingCharacter(Tab、Space、Nothing)控制标签位置以及标签与段落文本之间的分隔符,另外TabPosition、NumberPosition和TextPosition用于精确布局。IsLegal强制使用法律式编号(始终为阿拉伯数字),不受NumberStyle的影响。
步骤 5:向列表层级添加图片项目符号
在目标层级上调用ListLevel.CreatePictureBullet()以创建图片项目符号定义,然后提供该项目符号的ImageData,随后移除同一层级上已有的文字项目符号格式。调用DeletePictureBullet()可以删除图片项目符号并恢复为基于文字的项目符号格式。
步骤 6:检查列表项的渲染标签
ListLabel 描述实际呈现的标签,用于单个列表项实例,从该项的段落格式获取。LabelString 是 Word 显示的文字——例如 “3.” 或 “•”——LabelValue 是其底层数值,而 Font 是标签自身的格式,独立于段落文本的格式。若要在序列的任意位置计算标签值而无需渲染整个列表,请调用 ListLevel.GetEffectiveValue(index, numberStyle, customNumberStyleFormat)。
常见问题与解决方案
两个段落应独立编号,继续相同的序列。 两个段落的’ ListFormat.List 引用相同的共享 List 对象。通过以下方式为第二组提供自己的列表 ListCollection.AddCopy(srcList) 而不是重复使用相同的 List.
自定义编号格式字符串未按预期呈现。 ListLevel.NumberFormat 不符合该级别预期的模式 NumberStyle. 验证 NumberFormat and NumberStyle 对于正在编辑的级别,已一致地设置。
以编程方式更改级别后,列表缩进看起来不正确。 ListLevelNumber 直接设置而未更新相关位置属性。请使用 ListFormat.ListIndent()/ListOutdent() 而不是设置 ListLevelNumber 直接。
在某个级别上未显示图片项目符号。 该级别未创建图片项目符号,或仍在使用默认的文本项目符号格式。请调用 ListLevel.CreatePictureBullet() 并在移除文本项目符号格式之前提供图像数据。
样式链接的列表不会响应直接的格式更改。 Check List.IsListStyleReference — 样式引用列表的格式由其链接的 Style (通过 List.Style),而不是直接编辑列表。与…进行比较 IsListStyleDefinition 以区分自行定义格式的列表。
常见问题
List 和 ListFormat 有什么区别?
List 是跨段落共享的可重复使用的编号或项目符号定义。ListFormat 是每段独有的——它指向特定段落使用的 List 以及通过 ListFormat.List 和 ListLevelNumber 确定的层级。
如何检查段落是否已经是列表的一部分?
阅读段落格式中的 ListFormat.IsListItem。如果 true,ListFormat.List 和 ListLevelNumber 能识别它所属的列表和层级。
如何让新列表独立于已有列表,从 1 开始编号?
使用 ListCollection.AddCopy(srcList) 创建列表定义的独立副本,然后将该副本应用于新段落,而不是重复使用原始的 List,后者会继续相同的计数。
如何从头创建项目符号列表或编号列表?
使用 ListFormat.ApplyBulletDefault() 或 ApplyNumberDefault() 来实现 Word 的默认格式,或者使用 ListCollection.Add(listTemplate) 并配合 ListTemplate 值,从预定义的格式开始并自定义由此产生的 List.ListLevels。
如何将数字格式设为“1)”而不是“1.”?
在相关层级上将 ListLevel.NumberFormat 设置为所需的格式字符串,并将 NumberStyle 用于数字样式本身。