Sdílet prostřednictvím


Vlastní textové zadání

Základní textová rozhraní API v oboru názvů Windows.UI.Text.Core umožňují aplikaci pro Windows přijímat textové vstupy z libovolné textové služby podporované na zařízeních s Windows. Rozhraní API jsou podobná rozhraním Text Services Framework, protože aplikace nemusí mít podrobné znalosti textových služeb. Aplikace tak může přijímat text v libovolném jazyce a z libovolného typu vstupu (například klávesnice, řeči nebo pera).

Důležitá rozhraní API: Windows.UI.Text.Core, CoreTextEditContext

Proč používat základní textová rozhraní API?

U mnoha aplikací stačí ovládací prvky textového pole XAML nebo HTML pro zadávání a úpravy textu. Pokud ale vaše aplikace zpracovává složité textové scénáře, jako je aplikace pro zpracování textu, budete možná potřebovat flexibilitu vlastního ovládacího prvku pro úpravy textu. K vytvoření ovládacího prvku pro úpravu textu můžete použít rozhraní API pro klávesnici CoreWindow, ale tato rozhraní nenabízejí způsob přijímání textového zadání založeného na složení, což je nezbytné pro podporu východoasijských jazyků.

Místo toho použijte rozhraní API Windows.UI.Text.Core , pokud potřebujete vytvořit vlastní ovládací prvek pro úpravy textu. Tato rozhraní API jsou navržená tak, aby poskytovala velkou flexibilitu při zpracování textového vstupu v libovolném jazyce a poskytovala prostředí pro text, které je pro vaši aplikaci nejvhodnější. Ovládací prvky pro zadávání textu a úpravy vytvořené pomocí základních textových rozhraní API mohou přijímat textové vstupy ze všech existujících metod zadávání textu na zařízeních s Windows, včetně editorů vstupních metod (IME) založených na Text Services Framework a ručního psaní na počítačích, až po klávesnici WordFlow (která poskytuje automatickou opravu, predikci a diktování) na mobilních zařízeních.

Architektura

Následuje jednoduchá reprezentace textového vstupního systému.

  • "Aplikace" představuje aplikaci pro Windows hostující vlastní ovládací prvek pro úpravy vytvořený pomocí základních textových rozhraní API.
  • Rozhraní API Windows.UI.Text.Core usnadňují komunikaci s textovými službami prostřednictvím Windows. Komunikace mezi ovládacím prvku pro úpravy textu a textovými službami se zpracovává primárně prostřednictvím objektu CoreTextEditContext , který poskytuje metody a události pro usnadnění komunikace.

Diagram architektury CoreText

Rozsahy textu a výběr

Ovládací prvky pro úpravy poskytují místo pro zadávání textu a uživatelé očekávají, že text budou upravovat kdekoli v tomto prostoru. Tady vysvětlujeme systém umístění textu používaný základními textovými rozhraními API a způsob znázornění rozsahů a výběrů v tomto systému.

Pozice kurzoru aplikace

Rozsahy textu používané se základními textovými rozhraními API jsou vyjádřeny z hlediska pozic kurzoru. Pozice kurzoru aplikace (ACP) je číslo číslované od nuly, které označuje počet znaků od začátku textového proudu bezprostředně před kurzorem, jak je znázorněno zde.

snímek obrazovky zobrazující počet znaků v pozici kurzoru aplikace (ACP)

Rozsahy textu a výběr

Rozsahy a výběry textu jsou reprezentovány strukturou CoreTextRange , která obsahuje dvě pole:

Pole Datový typ Popis
StartCaretPosition číslo [JavaScript] | System.Int32 [.NET] | int32 [C++] Počáteční pozice rozsahu je ACP bezprostředně před prvním znakem.
EndCaretPosition číslo [JavaScript] | System.Int32 [.NET] | int32 [C++] Koncová pozice rozsahu je ACP bezprostředně za posledním znakem.

 

Například v oblasti textu zobrazené dříve určuje oblast [0, 5] slovo "Hello". StartCaretPosition musí být vždy menší než nebo rovno EndCaretPosition. Rozsah [5, 0] je neplatný.

Bod vkládání

Aktuální pozice kurzoru, často označovaná jako vkládací bod, je reprezentována nastavením StartCaretPosition tak, aby byla rovna EndCaretPosition.

Nesouvislý výběr

Některé ovládací prvky pro úpravy podporují nesouvislé výběry. Aplikace Microsoft Office například podporují více libovolných výběrů a mnoho editorů zdrojového kódu podporuje výběr sloupců. Základní textová rozhraní API ale nepodporují nesouvislé výběry. Ovládací prvky pro úpravy musí hlásit pouze jeden souvislý výběr, nejčastěji aktivní dílčí oblast nesouvislých výběrů.

Například následující obrázek ukazuje textový proud se dvěma nesouvisenými výběry: [0, 1] a [6, 11], pro které musí ovládací prvek pro úpravy hlásit pouze jeden ([0, 1] nebo [6, 11]).

Snímek obrazovky znázorňující nesousedící výběr textu, kde je vybraný první znak a posledních pět znaků

Práce s textem

Třída CoreTextEditContext umožňuje tok textu mezi Windows a editačními ovládacími prvky prostřednictvím události TextUpdating, události TextRequested a metody NotifyTextChanged.

Váš ovládací prvek pro úpravy přijímá text prostřednictvím události TextUpdating, která se generuje, když uživatelé interagují s metodami zadávání textu, jako jsou klávesnice, řeč nebo IME.

Když změníte text v ovládacím prvku pro úpravy, například vložením textu do ovládacího prvku, musíte windows upozornit voláním NotifyTextChanged.

Pokud textová služba vyžaduje nový text, vyvolá se událost TextRequested . Do obslužn é rutiny události TextRequested je nutné zadat nový text.

Příjem aktualizací textu

Ovládací prvek pro úpravy by měl obvykle přijímat žádosti o aktualizaci textu, protože představují text, který chce uživatel zadat. U vašeho ovládacího prvku pro úpravy se v obslužné rutině události TextUpdating očekávají tyto akce:

  1. Vložte text specifikovaný v CoreTextTextUpdatingEventArgs.Text na pozici specifikovanou v CoreTextTextUpdatingEventArgs.Range.
  2. Umístěte výběr na pozici zadanou v CoreTextTextUpdatingEventArgs.NewSelection.
  3. Upozorněte systém, že aktualizace byla úspěšná, tím že nastavíte CoreTextTextUpdatingEventArgs.Result na CoreTextTextUpdatingResult.Succeeded.

Například toto je stav editačního prvku než uživatel napíše "d". Vkládací bod je na [10, 10].

snímek obrazovky s diagramem toku textu znázorňující umístění kurzoru na pozici [10, 10], před vložením

Když uživatel zadá "d", je vyvolána událost TextUpdating s následujícími CoreTextTextUpdatingEventArgs daty.

V ovládacím prvku pro úpravy použijte zadané změny a nastavte Výsledek na Úspěch. Tady je stav ovládacího prvku po použití změn.

snímek obrazovky s diagramem textového proudu zobrazující místo vkládání na souřadnicích [11, 11], po vložení

Odmítnutí aktualizací textu

Někdy nelze použít aktualizace textu, protože požadovaný rozsah je v oblasti ovládacího prvku pro úpravy, který by neměl být změněn. V takovém případě byste neměli použít žádné změny. Místo toho upozorněte systém, že aktualizace selhala nastavením CoreTextTextUpdatingEventArgs.Result na CoreTextTextUpdatingResult.Failed.

Představte si například ovládací prvek pro úpravy, který přijímá pouze e-mailovou adresu. Mezery by měly být odmítnuty, protože e-mailové adresy nemohou obsahovat mezery, takže když jsou vyvolány události TextUpdating pro klávesu mezerníku, měli byste jednoduše nastavit Výsledek na Nezdařilo se ve vašem ovládacím prvku pro úpravu.

Upozorňování změn textu

Někdy váš ovládací prvek pro úpravy provádí změny textu, například když je text vložen nebo automaticky opraven. V těchto případech je nutné upozornit textové služby těchto změn voláním NotifyTextChanged metoda.

Jedná se například o stav ovládacího prvku pro úpravy před vložením "World". Bod vložení je na [6, 6].

Snímek obrazovky diagramu textového toku ukazující místo vložení v pozici [6, 6], před vložením

Uživatel provede akci vložení a ovládací prvek pro úpravy po použití změn:

snímek obrazovky s diagramem textového proudu zobrazující místo vkládání na souřadnicích [11, 11], po vložení

V takovém případě byste měli volat NotifyTextChanged s těmito argumenty:

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

Jedna nebo více událostí TextRequested bude následovat; tyto události zpracováváte, abyste aktualizovali text, se kterým textové služby pracují.

Přepsání textových aktualizací

V rámci editačního prvku možná budete chtít nahradit aktualizaci textu, abyste poskytli funkce automatické opravy.

Představte si například ovládací prvek pro editaci, který poskytuje funkci opravy, jež formalizuje zkrácené tvary. Toto je stav ovládacího prvku pro úpravy před tím, než uživatel zadá klávesu mezery k aktivaci opravy. Vložený bod je na [3, 3].

snímek obrazovky zobrazující diagram textového streamu s místem pro vložení na [3, 3], před vložením

Uživatel stiskne mezerník a vyvolá se odpovídající událost TextUpdating. Ovládací prvek pro úpravy přijímá aktualizaci textu. Toto je stav ovládacího prvku pro úpravy po krátkou chvíli před dokončením opravy. Bod vložení je na [4, 4].

snímek obrazovky s diagramem toku textu znázorňujícím bod vkládání na [4, 4], po vložení

Mimo obslužnou rutinu události TextUpdating editační ovládací prvek provede následující opravu. Toto je stav ovládacího prvku pro úpravy po dokončení opravy. Pozice pro vložení je na [5, 5].

snímek obrazovky s diagramem textového streamu zobrazující bod vložení ve [5, 5]

V takovém případě byste měli volat NotifyTextChanged s těmito argumenty:

  • upravenýRozsah = [1, 2]
  • newLength = 2
  • newSelection = [5, 5]

Jedna nebo více událostí TextRequested bude následovat; tyto události zpracováváte, abyste aktualizovali text, se kterým textové služby pracují.

Poskytnutí požadovaného textu

Je důležité, aby textové služby měly správný text, aby poskytovaly funkce, jako je automatická oprava nebo predikce, zejména pro text, který už existoval v ovládacím prvku pro úpravy, od načtení dokumentu, například textu, který je vložen ovládacím prvku pro úpravy, jak je vysvětleno v předchozích částech. Proto při každém vyvolání události TextRequested musíte poskytnout aktuální text ve vašem ovládacím prvku pro úpravy pro zadaný rozsah.

Ve službě CoreTextTextRequest bude rozsah , který váš ovládací prvek pro úpravy nemůže pojmout as-is. Například rozsah je větší než velikost ovládacího prvku pro úpravy v době události TextRequested nebo je konec rozsahu mimo hranice. V těchto případech byste měli vrátit jakýkoli rozsah, který dává smysl, což je obvykle podmnožina požadovaného rozsahu.

Vzorky

Archivní ukázky