Як працювати зі списками у .NET
Як працювати зі списками в .NET
Нумеровані та марковані списки у документі Word створюються з трьох співпрацюючих об’єктів: List, повторно використовуваного визначення нумерації; ListFormat, який вказує конкретному абзацу, до якого списку та рівня він належить; і ListLevel, який містить фактичне форматування одного рівня. Цей посібник показує, як застосувати список до абзацу, запобігти спільному використанню лічильника різними списками, переміщувати абзаци між рівнями та налаштовувати форматування нумерації та маркерів за допомогою Aspose.Words FOSS для .NET.
Покроковий посібник
Крок 1: Застосувати список до абзацу
Використовуйте ListFormat.ApplyBulletDefault() або ApplyNumberDefault() у форматуванні абзацу, щоб застосувати типовий маркований або нумерований список Word одним викликом — це найшвидший спосіб застосувати стандартний список. Для конкретного заздалегідь визначеного формату замість типового викличте Document.Lists (a ListCollection) .Add(listTemplate) зі значенням ListTemplate, таким як BulletDisk, BulletSquare, NumberArabicDot або NumberUppercaseRomanDot, щоб створити List з одного зі вбудованих форматів Word, або 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 для самого стилю цифр.