Megosztás a következőn keresztül:


Egyéni szövegbevitel

A Windows.UI.Text.Core névtérben található alapvető szöveges API-k lehetővé teszik, hogy a Windows-alkalmazások szöveges bemeneteket kapjanak a Windows-eszközökön támogatott bármely szöveges szolgáltatásból. Az API-k hasonlóak a Text Services Framework API-khoz, mert az alkalmazásnak nem kell részletes ismeretekkel rendelkeznie a szövegszolgáltatásokról. Ez lehetővé teszi, hogy az alkalmazás bármilyen nyelven és bármilyen bemeneti típusból (például billentyűzetről, beszédből vagy tollból) fogadjon szöveget.

Fontos API-k: Windows.UI.Text.Core, CoreTextEditContext

Miért érdemes alapvető szöveges API-kat használni?

Sok alkalmazás esetében az XAML- vagy HTML-szövegdoboz-vezérlők elegendőek a szövegbevitelhez és a szerkesztéshez. Ha azonban az alkalmazás összetett szövegforgatókönyveket( például szövegszerkesztő alkalmazásokat) kezel, szükség lehet egy egyéni szövegszerkesztő vezérlő rugalmasságára. A CoreWindow billentyűzet API-kkal létrehozhatja a szövegszerkesztési vezérlőt, de ezek nem biztosítják a kelet-ázsiai nyelvek támogatásához szükséges kompozícióalapú szövegbevitel fogadását.

Ehelyett használja a Windows.UI.Text.Core API-kat, ha egyéni szöveg szerkesztési vezérlőt kell létrehoznia. Ezek az API-k úgy lettek kialakítva, hogy nagy rugalmasságot biztosítsanak a szövegbevitel bármilyen nyelven történő feldolgozásában, és lehetővé teszik az alkalmazáshoz leginkább illő szövegélmény biztosítását. A szövegbeviteli és szerkesztési vezérlők az alapvető szöveges API-k segítségével fogadják a windowsos eszközök összes meglévő szövegbeviteli metódusát, a Text Services Framework-alapú beviteli módszer szerkesztőitől (IME-ktől) és a számítógépeken lévő kézírástól a WordFlow billentyűzetig (amely automatikus javítást, előrejelzést és diktálást biztosít) a mobileszközökön.

Architecture

Az alábbiakban a szövegbeviteli rendszer egyszerű ábrázolása található.

  • Az "Alkalmazás" egy olyan Windows-alkalmazást jelöl, amely az alapvető szöveges API-k használatával létrehozott egyéni szerkesztési vezérlőt üzemeltet.
  • A Windows.UI.Text.Core API-k megkönnyítik a szöveges szolgáltatásokkal való kommunikációt a Windowson keresztül. A szövegszerkesztési vezérlő és a szövegszolgáltatások közötti kommunikációt elsősorban egy CoreTextEditContext objektum kezeli, amely a kommunikációt megkönnyítő módszereket és eseményeket biztosítja.

CoreText architektúradiagram

Szövegtartományok és kijelölés

A szerkesztési vezérlők helyet biztosítanak a szövegbevitelhez, és a felhasználók várhatóan bárhol szerkeszthetik a szöveget ezen a helyen. Itt ismertetjük az alapvető szöveges API-k által használt szöveghelyezési rendszert, valamint azt, hogy a tartományok és a kijelölések hogyan jelennek meg ebben a rendszerben.

Alkalmazás kurzorpozíciója

Az alapvető szöveges API-khoz használt szövegtartományok a kurzor pozíciókban vannak megadva. Az "Application Caret Position (ACP)" egy nulla alapú szám, amely a szövegfolyam elejétől közvetlenül a kurzor előtt lévő karakterek számát jelzi, ahogy az itt látható.

Képernyőkép az Application Caret Position (ACP) karakterszámáról

Szövegtartományok és kijelölés

A szövegtartományokat és a kijelöléseket a CoreTextRange struktúra jelöli, amely két mezőt tartalmaz:

szakterület Adattípus Description
StartCaretPosition Szám [JavaScript] | System.Int32 [.NET] | int32 [C++] A tartomány kezdőpozíciója az ACP, közvetlenül az első karakter előtt.
EndCaretPosition Szám [JavaScript] | System.Int32 [.NET] | int32 [C++] A tartomány végpozíciója az AKCS, közvetlenül az utolsó karakter után.

 

A korábban látható szövegtartományban például a [0, 5] tartomány a "Hello" szót adja meg. A StartCaretPosition-nak mindig kisebbnek vagy egyenlőnek kell lennie, mint az EndCaretPosition. Az [5, 0] tartomány érvénytelen.

Beszúrási pont

Az aktuális kurzor pozíciót (más néven beszúrási pontot) úgy ábrázolják, hogy a StartCaretPosition értéke megegyezik az EndCaretPosition értékével.

Nem egyértelmű kijelölés

Egyes szerkesztési vezérlők nem egyértelmű kijelöléseket támogatnak. A Microsoft Office-alkalmazások például több tetszőleges kijelölést támogatnak, és számos forráskódszerkesztő támogatja az oszlopkiválasztást. Az alapvető szöveges API-k azonban nem támogatják a nem összefüggő kijelöléseket. A szerkesztési vezérlőknek csak egyetlen összefüggő kijelölést kell jelentenie, leggyakrabban a nem egyértelmű kijelölések aktív altartományát.

Az alábbi képen például egy szövegfolyam látható két nem összefüggő kijelöléssel: [0, 1] és [6, 11], amelyeknél a szerkesztési vezérlőnek csak egyet kell jelentenie ([0, 1] vagy [6, 11]).

Nem összefüggő szövegkijelölést ábrázoló képernyőkép, amelyen az első és az utolsó öt karakter van kijelölve.

Szöveg használata

A CoreTextEditContext osztály a TextUpdating eseményen, a TextRequested eseményen és az NotifyTextChanged metóduson keresztül engedélyezi a szövegfolyamot a Windows és a szerkesztési vezérlők között.

A szerkesztési vezérlő szövegbeviteli eseményeken keresztül fogadja a szöveget, amelyek akkor jönnek létre, amikor a felhasználók szövegbeviteli módszerekkel , például billentyűzetekkel, beszéddel vagy csevegőgépekkel kommunikálnak.

Ha módosítja a szerkesztési vezérlő szövegét, például ha szöveget illeszt be a vezérlőbe, a NotifyTextChanged meghívásával értesítenie kell a Windowst.

Ha a szövegszolgáltatásnak szüksége van az új szövegre, akkor létrejön egy TextRequested esemény. Meg kell adnia az új szöveget a TextRequested eseménykezelőben.

Szövegfrissítések elfogadása

A szerkesztési vezérlőnek általában szövegfrissítési kéréseket kell elfogadnia, mert azok a felhasználó által beírandó szöveget jelölik. A TextUpdating eseménykezelőben ezek a műveletek a szerkesztési vezérlőtől várhatók:

  1. Szúrja be a CoreTextTextUpdatingEventArgs.Text fájlban megadott szöveget a CoreTextTextUpdatingEventArgs.Range fájlban megadott helyre.
  2. Helyezze a kijelölést a CoreTextTextUpdatingEventArgs.NewSelection fájlban megadott helyre.
  3. Értesítse a rendszert, hogy a frissítés sikeres volt, a CoreTextTextUpdatingEventArgs.Result értékének CoreTextTextUpdatingResult.Succeeded-re állításával.

Ez például egy szerkesztési vezérlő állapota, mielőtt a felhasználó a "d" típust választja. A beszúrási pont a következő: [10, 10].

Képernyőkép egy szövegátviteli diagramról, amely a [10, 10] helyen lévő beszúrási pontot mutatja, még a beszúrás előtt

Amikor a felhasználó a "d" típust írja be, a rendszer a következő CoreTextTextUpdatingEventArgs-adatokkal egy TextUpdating eseményt hoz létre:

A szerkesztési vezérlőben alkalmazza a megadott módosításokat, és állítsa az eredménytsikeresre. A módosítások alkalmazása után a vezérlő állapota a következő.

Képernyőkép egy szövegfolyamdiagramról, amelyen a beszúrási pont a beszúrás után a következő helyen látható: \[11, 11\].

Szövegfrissítések elutasítása

Előfordulhat, hogy a szövegfrissítések nem alkalmazhatók, mert a kért tartomány a szerkesztési vezérlő olyan területén található, amelyet nem szabad módosítani. Ebben az esetben nem alkalmazhat módosításokat. Ehelyett értesítse a rendszert arról, hogy a frissítés meghiúsult a CoreTextTextUpdatingEventArgs.Result to CoreTextTextUpdatingResult.Failed beállításával.

Vegyük például egy szerkesztési vezérlőt, amely csak egy e-mail címet fogad el. A szóközöket el kell utasítani, mert az e-mail-címek nem tartalmazhatnak szóközöket, ezért amikor TextUpdating eseményeket emelnek ki a szóközbillentyűhöz, egyszerűen állítsa a Result értékét Failed-re a szerkesztési vezérlőben.

Szövegmódosítások értesítése

Előfordulhat, hogy a szerkesztési vezérlő módosítja a szöveget, például a szöveg beillesztésekor vagy automatikus javításakor. Ezekben az esetekben a NotifyTextChanged metódus meghívásával értesítenie kell a szöveges szolgáltatásokat ezekről a változásokról.

Ez például egy szerkesztési vezérlő állapota, mielőtt a felhasználó beillesztené a "World" szöveget. A beszúrási pont a következő: [6, 6].

Képernyőkép egy szövegfolyamdiagramról, amely az [6, 6] beszúrási pontot mutatja egy beszúrás előtt

A felhasználó végrehajtja a beillesztési műveletet és a szerkesztési vezérlőt a módosítások alkalmazása után:

Képernyőkép egy szövegfolyamdiagramról, amelyen a beszúrási pont a beszúrás után a következő helyen látható: \[11, 11\].

Ha ez történik, az alábbi argumentumokkal kell meghívnia a NotifyTextChanged függvényt :

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

Egy vagy több TextRequested esemény következik, amelyeket a szövegszolgáltatások által kezelt szöveg frissítésére használsz.

Szövegfrissítések felülírása

A szerkesztési vezérlőben felülbírálhat egy szövegfrissítést, hogy automatikus javítási lehetőségeket biztosítson.

Vegyük például egy szerkesztési vezérlőt, amely egy olyan korrekciós funkciót biztosít, amely formálissá teszi a kontrakciókat. Ez a szerkesztési vezérlő állapota, mielőtt a felhasználó beszedi a szóközbillentyűt a javítás elindításához. A beszúrási pont a következő: [3, 3].

Képernyőkép egy szövegfolyam-diagramról, amely a beszúrási pontot mutatja a [3, 3] koordinátán, a beszúrás előtt

A felhasználó lenyomja a szóközbillentyűt, és egy megfelelő TextUpdating esemény jön létre. A szerkesztési vezérlő elfogadja a szövegfrissítést. Ez a szerkesztési vezérlő állapota egy rövid ideig, mielőtt a javítás befejeződik. A beszúrási pont a következő: [4, 4].

Képernyőkép egy szövegfolyamdiagramról, amelyen a beszúrási pont a beszúrás után a következő helyen látható: [4, 4].

A TextUpdating eseménykezelőn kívül a szerkesztési vezérlő az alábbi javítást hajtja végre. Ez a szerkesztési vezérlő állapota a javítás befejezése után. A beszúrási pont a következő: [5, 5].

Képernyőkép egy szövegfolyamdiagramról, amelyen a beszúrási pont látható: [5, 5]

Ha ez történik, az alábbi argumentumokkal kell meghívnia a NotifyTextChanged függvényt :

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

Egy vagy több TextRequested esemény következik, amelyeket a szövegszolgáltatások által kezelt szöveg frissítésére használsz.

Kért szöveg megadása

Fontos, hogy a szövegszolgáltatások megfelelő szövegekkel rendelkezzenek, hogy olyan funkciókat biztosítsanak, mint az automatikus javítás vagy az előrejelzés, különösen a szerkesztési vezérlőben már létező szövegek esetében, például a dokumentum betöltésétől, vagy a szerkesztési vezérlő által beszúrt szövegtől az előző szakaszokban leírtak szerint. Ezért amikor egy TextRequested esemény bekövetkezik, meg kell adnia a szerkesztési vezérlőben található szöveget a megadott tartományhoz.

Előfordulhat, hogy a CoreTextTextRequesttartománya olyan tartományt határoz meg, amelyet a szerkesztési vezérlő nem tud befogadni as-is. A tartomány például nagyobb, mint a szerkesztő vezérlő mérete a TextRequested esemény idején, vagy a tartomány vége a határon kívül van. Ezekben az esetekben minden értelmes tartományt vissza kell adnia, ami általában a kért tartomány egy részhalmaza.

Samples

Archív minták