Jak pracować z listami w .NET
Jak pracować z listami w .NET
Listy numerowane i wypunktowane w dokumencie Word są budowane z trzech współpracujących obiektów: List, definiującej wielokrotnego użytku definicję numeracji; ListFormat, który określa, do której listy i poziomu należy konkretny akapit; oraz ListLevel, który przechowuje rzeczywiste formatowanie jednego poziomu. Ten przewodnik pokazuje, jak zastosować listę do akapitu, zapobiec współdzieleniu licznika przez oddzielne listy, przenosić akapity między poziomami oraz dostosować formatowanie numeracji i wypunktowań przy użyciu Aspose.Words FOSS dla .NET.
Przewodnik krok po kroku
Krok 1: Zastosuj listę do akapitu
Użyj ListFormat.ApplyBulletDefault() lub ApplyNumberDefault() w formatowaniu akapitu, aby w jednym wywołaniu zastosować domyślną wypunktowaną lub numerowaną listę Worda — jest to najszybszy sposób na zastosowanie standardowej listy. Aby zamiast domyślnego użyć konkretnego, predefiniowanego formatu, wywołaj Document.Lists (a ListCollection) .Add(listTemplate) z wartością ListTemplate, taką jak BulletDisk, BulletSquare, NumberArabicDot lub NumberUppercaseRomanDot, aby utworzyć List z jednego z wbudowanych formatów Worda, lub AddSingleLevelList(listTemplate) dla wariantu jednopłaszczyznowego. Gdy akapit ma formatowanie listy, ListFormat.IsListItem zgłasza true, a ListFormat.List/ListLevelNumber określają, której listy i poziomu używa.
Krok 2: Przypisz nowej grupie akapitów niezależną numerację
Akapity, których ListFormat.List wskazuje na ten sam współdzielony obiekt List, kontynuują ten sam licznik. Gdy nowa grupa akapitów wymaga numeracji, która rozpoczyna się od 1 niezależnie, wywołaj ListCollection.AddCopy(srcList), aby zduplikować istniejącą definicję listy, a następnie zastosuj kopię do nowych akapitów zamiast ponownie używać oryginału. ListCollection.GetListByListId(listId) pobiera określoną listę według jej ListId, gdy potrzebujesz ją odnaleźć zamiast tworzyć, a Count informuje, ile list aktualnie ma dokument.
Krok 3: Przenieś akapit pomiędzy poziomami listy
Użyj ListFormat.ListIndent(), aby przenieść akapit o jeden poziom głębiej w swojej liście, oraz ListOutdent(), aby przenieść go o jeden poziom wyżej — to same operacje, które Word wykonuje przy użyciu Tab i Shift+Tab na początku akapitu listy. Preferuj te metody zamiast bezpośredniego ustawiania ListLevelNumber, ponieważ utrzymują one formatowanie listy akapitu spójne wewnętrznie. Wywołaj RemoveNumbers(), aby całkowicie usunąć formatowanie listy z akapitu.
Krok 4: Dostosuj format numeracji poziomu listy
Uzyskaj dostęp do określonego poziomu za pomocą List.ListLevels (a ListLevelCollection), a następnie ustaw ListLevel.NumberStyle (wartość NumberStyle, taką jak Arabic, UppercaseRoman, LowercaseLetter lub Bullet) oraz NumberFormat — łańcuch formatowania łączący numer z tekstem dosłownym, takim jak kropka lub nawias — razem, ponieważ niepasująca para powoduje nieoczekiwane renderowanie. StartAt ustawia początkowy numer poziomu, a RestartAfterLevel kontroluje, którego wyższego poziomu przyrost ponownie uruchamia licznik tego poziomu — ustaw to wyraźnie w zagnieżdżonych listach zamiast polegać na domyślnym zachowaniu restartu. Alignment (Left, Center, Right) oraz TrailingCharacter (Tab, Space, Nothing) kontrolują pozycję etykiety i separator między etykietą a tekstem akapitu, wraz z TabPosition, NumberPosition i TextPosition dla precyzyjnego układu. IsLegal wymusza numerację w stylu prawnym (zawsze arabskie), niezależnie od NumberStyle.
Krok 5: Dodaj obrazkową wypunktowanie do poziomu listy
Wywołaj ListLevel.CreatePictureBullet() na docelowym poziomie, aby utworzyć definicję obrazkowego wypunktowania, a następnie podaj ImageData wypunktowania przed usunięciem istniejącego formatowania tekstowego wypunktowania na tym samym poziomie. Wywołaj DeletePictureBullet(), aby usunąć obrazkowe wypunktowanie i przywrócić formatowanie oparte na tekście.
Krok 6: Zbadaj renderowaną etykietę elementu listy
ListLabel opisuje etykietę rzeczywiście renderowaną dla jednej instancji elementu listy, uzyskiwaną z formatowania akapitu elementu. LabelString to dosłowny tekst wyświetlany przez Word — np. „3.” lub „•” — LabelValue to podstawowa wartość numeryczna, a Font to formatowanie samej etykiety, niezależne od formatowania tekstu akapitu. Aby obliczyć wartość etykiety w dowolnym miejscu w sekwencji bez renderowania całej listy, wywołaj ListLevel.GetEffectiveValue(index, numberStyle, customNumberStyleFormat).
Typowe problemy i rozwiązania
Dwa akapity, które powinny być numerowane niezależnie, kontynuują tę samą sekwencję. Oba akapity’ ListFormat.List odnosi się do tego samego współdzielonego List obiektu. Daj drugiej grupie własną listę za pomocą ListCollection.AddCopy(srcList) zamiast ponownie używać tego samego List.
Niestandardowy ciąg formatu numeracji nie wyświetla się zgodnie z oczekiwaniami. ListLevel.NumberFormat nie pasuje do wzorca oczekiwanego dla poziomu NumberStyle. Zweryfikuj NumberFormat and NumberStyle są ustawiane konsekwentnie dla edytowanego poziomu.
Wcięcie listy wygląda nieprawidłowo po programowym zmianie poziomów. ListLevelNumber zostało ustawione bezpośrednio bez aktualizacji powiązanych właściwości pozycji. Użyj ListFormat.ListIndent()/ListOutdent() zamiast ustawiania ListLevelNumber bezpośrednio.
Obrazkowa wypunktowanie nie pojawia się na poziomie. Nie utworzono obrazkowego wypunktowania dla tego poziomu, lub domyślne formatowanie wypunktowania tekstowego jest nadal aktywne. Wywołaj ListLevel.CreatePictureBullet() i podaj dane obrazu przed usunięciem formatowania wypunktowania tekstowego.
Lista powiązana ze stylem nie reaguje na bezpośrednie zmiany formatowania. Check List.IsListStyleReference — formatowanie listy odwołującej się do stylu jest kontrolowane przez jej powiązaną Style (przez List.Style), nie przez edytowanie listy bezpośrednio. Porównaj z IsListStyleDefinition aby odróżnić listę, która definiuje własne formatowanie.
Najczęściej Zadawane Pytania
Jaka jest różnica między List a ListFormat?
List jest wielokrotnie używaną definicją numeracji lub wypunktowania współdzieloną pomiędzy akapitami. ListFormat jest określana dla każdego akapitu — wskazuje, którego List konkretny akapit używa i na którym poziomie, za pośrednictwem ListFormat.List i ListLevelNumber.
Jak sprawdzić, czy akapit jest już częścią listy?
Przeczytaj ListFormat.IsListItem dotyczącą formatowania akapitu. Jeśli true, ListFormat.List i ListLevelNumber identyfikują, do której listy i poziomu on należy.
Jak sprawić, by nowa lista zaczynała numerację od 1 niezależnie od istniejącej listy?
Użyj ListCollection.AddCopy(srcList), aby utworzyć niezależną kopię definicji listy, a następnie zastosuj tę kopię do nowych akapitów zamiast ponownego użycia oryginalnego List, które kontynuowałoby ten sam licznik.
Jak utworzyć listę wypunktowaną lub numerowaną od podstaw?
Użyj ListFormat.ApplyBulletDefault() lub ApplyNumberDefault() do domyślnego formatowania w Wordzie, lub ListCollection.Add(listTemplate) z wartością ListTemplate, aby rozpocząć od predefiniowanego formatu i dostosować powstały List.ListLevels od tego miejsca.
Jak uzyskać format numeracji taki jak „1)” zamiast „1.”?
Ustaw ListLevel.NumberFormat na odpowiednim poziomie na żądany ciąg formatu, wraz z NumberStyle dla samego stylu cyfr.