Udostępnij przez


Niestandardowe wprowadzanie tekstu

Podstawowe interfejsy API tekstu w przestrzeni nazw Windows.UI.Text.Core umożliwiają aplikacji systemu Windows odbieranie tekstu z dowolnej usługi tekstowej obsługiwanej na urządzeniach z systemem Windows. Interfejsy API są podobne do API Struktury Usług Tekstowych, ponieważ aplikacja nie musi mieć szczegółowej wiedzy na temat usług tekstowych. Dzięki temu aplikacja może odbierać tekst w dowolnym języku i z dowolnego typu danych wejściowych (takich jak klawiatura, mowa lub pióro).

Ważne interfejsy API: Windows.UI.Text.Core, CoreTextEditContext

Dlaczego warto używać podstawowych interfejsów API tekstu?

W przypadku wielu aplikacji kontrolki XAML lub HTML pola tekstowego są wystarczające do wprowadzania i edytowania tekstu. Jeśli jednak aplikacja obsługuje złożone scenariusze tekstowe, takie jak aplikacja do przetwarzania wyrazów, może być potrzebna elastyczność niestandardowej kontrolki edycji tekstu. Możesz użyć interfejsów API klawiatury CoreWindow do utworzenia kontrolki edycji tekstu, ale nie zapewniają one sposobu odbierania danych tekstowych opartych na kompozycji, co jest wymagane do obsługi języków wschodnioazjatyckich.

Zamiast tego użyj interfejsów API Windows.UI.Text.Core , gdy musisz utworzyć niestandardową kontrolkę edycji tekstu. Te interfejsy API zostały zaprojektowane tak, aby zapewnić dużą elastyczność przetwarzania danych wejściowych tekstu w dowolnym języku i umożliwia zapewnienie najlepszego środowiska tekstowego dla aplikacji. Kontrolki wprowadzania tekstu i edycji utworzone za pomocą podstawowych interfejsów API tekstu mogą odbierać dane wejściowe tekstu ze wszystkich istniejących metod wprowadzania tekstu na urządzeniach z systemem Windows, z edytorów metod wejściowych opartych na strukturze usług tekstowych (IME) i pisma ręcznego na komputerach z klawiaturą WordFlow (która zapewnia automatyczną korektę, przewidywanie i dyktowanie) na urządzeniach przenośnych.

Architecture

Poniżej przedstawiono prostą reprezentację systemu wprowadzania tekstu.

  • "Aplikacja" reprezentuje aplikację systemu Windows hostująca niestandardową kontrolkę edycji utworzoną przy użyciu podstawowych interfejsów API tekstu.
  • Interfejsy API Windows.UI.Text.Core ułatwiają komunikację z usługami tekstowymi za pośrednictwem systemu Windows. Komunikacja między kontrolką edycji tekstu a usługami tekstowym jest obsługiwana głównie za pośrednictwem obiektu CoreTextEditContext , który udostępnia metody i zdarzenia ułatwiające komunikację.

Diagram architektury CoreText

Zakresy tekstu i wybór

Kontrolki edycji zapewniają miejsce na wprowadzanie tekstu, a użytkownicy oczekują edycji tekstu w dowolnym miejscu w tym miejscu. W tym miejscu wyjaśnimy system pozycjonowania tekstu używany przez podstawowe interfejsy API tekstu oraz sposób przedstawiania zakresów i zaznaczeń w tym systemie.

Pozycja kursora aplikacji

Zakresy tekstu używane z podstawowymi interfejsami API tekstu są wyrażane pod względem pozycji kursora. "Położenie kursora aplikacji (ACP)" to liczba zaczynająca się od zera, która wskazuje liczbę znaków od początku strumienia tekstu bezpośrednio przed kursorem, jak pokazano poniżej.

Zrzut ekranu przedstawiający liczbę znaków na podstawie pozycji kursora tekstowego aplikacji (ACP)

Zakresy tekstu i wybór

Zakresy tekstu i zaznaczenia są reprezentowane przez strukturę CoreTextRange zawierającą dwa pola:

(No changes needed) Typ danych Description
StartCaretPosition Liczba [JavaScript] | System.Int32 [.NET] | int32 [C++] Pozycja początkowa zakresu to ACP bezpośrednio przed pierwszym znakiem.
EndCaretPosition Liczba [JavaScript] | System.Int32 [.NET] | int32 [C++] Pozycja końcowa zakresu to ACP bezpośrednio po ostatnim znaku.

 

Na przykład w przedstawionym wcześniej zakresie tekstu zakres [0, 5] określa słowo "Hello". Wartość StartCaretPosition musi być zawsze mniejsza lub równa endCaretPosition. Zakres [5, 0] jest nieprawidłowy.

Punkt wstawiania

Bieżąca pozycja karetki, często nazywana punktem wstawiania, jest reprezentowana przez ustawienie wartości StartCaretPosition na wartość równą endCaretPosition.

Wybór nieciągły

Niektóre kontrolki edycji obsługują nieciągalne wybory. Na przykład aplikacje pakietu Microsoft Office obsługują wiele dowolnych wyborów, a wiele edytorów kodu źródłowego obsługuje wybór kolumn. Jednak podstawowe interfejsy API tekstu nie obsługują nieciągłych zaznaczeń. Kontrolki edycji muszą zgłaszać tylko jeden ciągły wybór, najczęściej aktywny podrzędny zakres nieciągłych zaznaczeń.

Na przykład na poniższym obrazie przedstawiono strumień tekstowy z dwoma nieciągłymi zaznaczeniami: [0, 1] i [6, 11], dla których kontrolka edycji musi zgłosić tylko jedno z nich ([0, 1] lub [6, 11]).

Zrzut ekranu przedstawiający nieciągłe zaznaczenie tekstu, w którym zaznaczono pierwszy znak i pięć ostatnich znaków.

Praca z tekstem

Klasa CoreTextEditContext umożliwia przepływ tekstu między systemem Windows a kontrolkami edycji za pośrednictwem zdarzenia TextUpdating, zdarzenia TextRequested i metody NotifyTextChanged.

Kontrolka edycji odbiera tekst za pomocą zdarzeń TextUpdating, które są generowane, gdy użytkownicy wchodzą w interakcję z metodami wprowadzania tekstu, takimi jak klawiatury, mowa lub IME.

Gdy zmienisz tekst w kontrolce edycji, na przykład wklejając tekst do kontrolki, musisz powiadomić system Windows, wywołując element NotifyTextChanged.

Jeśli usługa tekstowa wymaga nowego tekstu, zostanie zgłoszone zdarzenie TextRequested . Musisz podać nowy tekst w procedurze obsługi zdarzeń TextRequested .

Akceptowanie aktualizacji tekstu

Kontrolka edycji powinna zwykle akceptować żądania aktualizacji tekstu, ponieważ reprezentują tekst, który użytkownik chce wprowadzić. W procedurze obsługi zdarzeń TextUpdating oczekuje się następujących działań w kontrolce edycji:

  1. Wstaw tekst określony w CoreTextTextUpdatingEventArgs.Text w określonej pozycji w CoreTextTextUpdatingEventArgs.Range.
  2. Umieść zaznaczenie na pozycji określonej w CoreTextTextUpdatingEventArgs.NewSelection.
  3. Powiadom system, że aktualizacja powiodła się, ustawiając wartość CoreTextTextUpdatingEventArgs.Result na CoreTextUpdatingResult.Succeeded.

Na przykład jest to stan kontrolki edycji przed typem "d". Punkt wstawiania znajduje się na [10, 10].

Zrzut ekranu przedstawiający diagram strumienia tekstu z punktem wstawienia [10, 10], przed operacją wstawienia

Gdy użytkownik wpisze wartość "d", zdarzenie TextUpdating jest wywoływane z następującymi danymi CoreTextUpdatingEventArgs :

W kontrolce edycji zastosuj określone zmiany i ustaw wynik na Powodzenie. Oto stan kontrolki po zastosowaniu zmian.

Zrzut ekranu diagramu strumienia tekstu pokazujący punkt wstawiania w lokalizacji \[11, 11\], po wstawieniu

Odrzucanie aktualizacji tekstu

Czasami nie można zastosować aktualizacji tekstu, ponieważ żądany zakres znajduje się w obszarze kontrolki edycji, która nie powinna zostać zmieniona. W takim przypadku nie należy stosować żadnych zmian. Zamiast tego powiadom system, że aktualizacja nie powiodła się, ustawiając wartość CoreTextTextUpdatingEventArgs.Result na CoreTextUpdatingResult.Failed.

Rozważmy na przykład kontrolkę edycji, która akceptuje tylko adres e-mail. Spacje powinny zostać odrzucone, ponieważ adresy e-mail nie mogą zawierać spacji, więc gdy dla klucza spacji są zgłaszane zdarzenia textUpdating , należy po prostu ustawić wartość Wynik na Niepowodzenie w kontrolce edycji.

Powiadamianie o zmianach tekstu

Czasami kontrolka edycji wprowadza zmiany w tekście, takie jak wklejenie tekstu lub automatyczne poprawianie. W takich przypadkach należy powiadomić usługi tekstowe tych zmian, wywołując metodę NotifyTextChanged .

Na przykład jest to stan kontrolki edycji, zanim użytkownik wklei "World". Punkt wstawiania wynosi [6, 6].

Zrzut ekranu przedstawiający diagram strumienia tekstu przedstawiający punkt wstawiania o wartości [6, 6], przed wstawieniem

Użytkownik wykonuje akcję wklejania i kontrolkę edycji po zastosowaniu zmian:

Zrzut ekranu przedstawiający diagram strumienia tekstu z miejscem wstawiania w lokalizacji \[11, 11\], po wstawieniu

W takim przypadku należy wywołać metodę NotifyTextChanged z następującymi argumentami:

  • modifiedRange = [6, 6]
  • newLength = 5
  • newSelection = [11, 11]

Jedno lub więcej zdarzeń TextRequested nastąpi, które można obsługiwać w celu zaktualizowania tekstu, nad którym pracują usługi tekstowe.

Zastępowanie aktualizacji tekstowych

W kontrolce edycji możesz zastąpić aktualizację tekstu w celu zapewnienia funkcji autokorekty.

Rozważmy na przykład kontrolkę edycji, która udostępnia funkcję poprawek, która sformalizuje skurcze. Jest to stan kontrolki edycji, zanim użytkownik wpisze klucz spacji, aby wyzwolić korektę. Punkt wstawiania znajduje się w [3, 3].

Zrzut ekranu przedstawiający diagram strumienia tekstu przedstawiający punkt wstawiania w lokalizacji [3, 3], przed wstawieniem

Użytkownik naciska klawisz spacji i podnoszone jest odpowiednie zdarzenie TextUpdating. Kontrolka edycji akceptuje aktualizację tekstu. Jest to stan kontrolki edycji przez krótką chwilę przed zakończeniem korekty. Punkt wstawiania wynosi [4, 4].

Zrzut ekranu diagramu strumienia tekstu z zaznaczonym punktem wstawiania w miejscu [4, 4], po wstawieniu

Poza obsługą zdarzenia TextUpdating kontrolka edycji wprowadza następującą poprawkę. Jest to stan kontrolki edycji po zakończeniu korekty. Punkt wstawiania wynosi [5, 5].

Zrzut ekranu przedstawiający diagram strumienia tekstu z punktem wstawiania przy [5, 5]

W takim przypadku należy wywołać metodę NotifyTextChanged z następującymi argumentami:

  • modifiedRange = [1, 2]
  • newLength = 2
  • newSelection = [5, 5]

Jedno lub więcej zdarzeń TextRequested nastąpi, które można obsługiwać w celu zaktualizowania tekstu, nad którym pracują usługi tekstowe.

Podawanie żądanego tekstu

Ważne jest, aby usługi tekstowe miały poprawny tekst, aby udostępnić funkcje, takie jak automatyczna korekta lub przewidywanie, zwłaszcza w przypadku tekstu, który już istniał w kontrolce edycji, od ładowania dokumentu, na przykład lub tekstu wstawionego przez kontrolkę edycji, jak wyjaśniono w poprzednich sekcjach. W związku z tym za każdym razem, gdy jest zgłaszane zdarzenie TextRequested , należy podać tekst aktualnie w kontrolce edycji dla określonego zakresu.

Czasami zakres w obiekcie CoreTextTextRequest określa zakres, którego kontrolka edycji nie może pomieścić as-is. Na przykład zakres jest większy niż rozmiar kontrolki edycji w momencie zdarzenia TextRequested lub koniec zakresu jest poza granicami. W takich przypadkach należy zwrócić dowolny zakres, który jest logicznie sensowny, co zazwyczaj oznacza podzbiór żądanego zakresu.

Samples

Próbki archiwalne