Delen via


Aangepaste tekstinvoer

Met de kerntekst-API's in de Windows.UI.Text.Core-naamruimte kan een Windows-app tekstinvoer ontvangen van elke tekstservice die wordt ondersteund op Windows-apparaten. De API's zijn vergelijkbaar met de Text Services Framework-API's omdat de app geen gedetailleerde kennis van de tekstservices hoeft te hebben. Hierdoor kan de app tekst ontvangen in elke taal en van elk invoertype (zoals toetsenbord, spraak of pen).

Belangrijke API's: Windows.UI.Text.Core, CoreTextEditContext

Waarom kerntekst-API's gebruiken?

Voor veel apps zijn de besturingselementen voor het XAML- of HTML-tekstvak voldoende voor tekstinvoer en -bewerking. Als uw app echter complexe tekstscenario's verwerkt, zoals een tekstverwerkings-app, hebt u mogelijk de flexibiliteit nodig van een aangepast besturingselement voor het bewerken van tekst. U kunt de CoreWindow-toetsenbord-API's gebruiken om het besturingselement voor tekstbewerking te maken, maar deze bieden geen manier om tekstinvoer op basis van samenstelling te ontvangen. Dit is vereist voor de ondersteuning van Oost-Aziatische talen.

Gebruik in plaats daarvan de Windows.UI.Text.Core API's wanneer u een aangepast besturingselement voor tekstbewerking moet maken. Deze API's zijn ontworpen om u veel flexibiliteit te bieden bij het verwerken van tekstinvoer, in elke taal en om u de tekstervaring te bieden die het meest geschikt is voor uw app. Besturingselementen voor tekstinvoer en bewerking die zijn gebouwd met de kerntekst-API's, kunnen tekstinvoer ontvangen van alle bestaande tekstinvoerinvoermethoden op Windows-apparaten, van Text Services Framework op basis van Input Method Editors (IME's) en handschrift op pc's naar het WordFlow-toetsenbord (dat automatische correctie, voorspelling en dicteren biedt) op mobiele apparaten.

Architecture

Hier volgt een eenvoudige weergave van het tekstinvoersysteem.

  • Een applicatie vertegenwoordigt een Windows-applicatie die als host fungeert voor een aangepast aanpassingscontrole, gebouwd met de kerntekst-API's.
  • De WINDOWS.UI.Text.Core-API's faciliteren de communicatie met tekstservices via Windows. Communicatie tussen het besturingselement voor tekstbewerking en de tekstservices wordt voornamelijk verwerkt via een CoreTextEditContext-object dat de methoden en gebeurtenissen biedt om de communicatie te vergemakkelijken.

Diagram van coretext-architectuur

Tekstbereiken en selectie

Besturingselementen voor bewerken bieden ruimte voor tekstinvoer en gebruikers verwachten overal in deze ruimte tekst te bewerken. Hier leggen we het tekstpositioneringssysteem uit dat wordt gebruikt door de API's voor kerntekst en hoe reeksen en selecties in dit systeem worden weergegeven.

Positie van toepassingscursor

Tekstbereiken die worden gebruikt met de kerntekst-API's worden uitgedrukt in caretposities. Een Application Caret Position (ACP) is een op nul gebaseerd getal dat het aantal tekens aangeeft vanaf het begin van de tekststroom direct vóór de caret, zoals hier wordt weergegeven.

Schermopname van het aantal tekens voor Application Caret Position (ACP)

Tekstbereiken en selectie

Tekstbereiken en selecties worden vertegenwoordigd door de CoreTextRange-structuur die twee velden bevat:

Veld Gegevenstype Description
StartCaretPosition Nummer [JavaScript] | System.Int32 [.NET] | int32 [C++] De beginpositie van een bereik is de ACP direct vóór het eerste teken.
EndCaretPosition Nummer [JavaScript] | System.Int32 [.NET] | int32 [C++] De eindpositie van een bereik is de ACP direct na het laatste teken.

 

In het eerder weergegeven tekstbereik geeft bijvoorbeeld het bereik [0, 5] het woord 'Hallo' op. StartCaretPosition moet altijd kleiner dan of gelijk zijn aan de EndCaretPosition. Het bereik [5, 0] is ongeldig.

Invoegpositie

De huidige caretpositie, vaak de invoegpositie genoemd, wordt vertegenwoordigd door het instellen van de StartCaretPosition op gelijk aan de EndCaretPosition.

Niet-aaneengesloten selectie

Sommige besturingselementen voor bewerken ondersteunen niet-aaneengesloten selecties. Microsoft Office-apps ondersteunen bijvoorbeeld meerdere willekeurige selecties en veel broncode-editors ondersteunen kolomselectie. De kerntekst-API's bieden echter geen ondersteuning voor niet-aaneengesloten selecties. Besturingselementen voor bewerken moeten slechts één aaneengesloten selectie rapporteren, meestal het actieve subbereik van de niet-aaneengesloten selecties.

In de volgende afbeelding ziet u bijvoorbeeld een tekststroom met twee niet-aaneengesloten selecties: [0, 1] en [6, 11] waarvoor het besturingselement voor bewerken slechts één moet rapporteren ([0, 1] of [6, 11]).

Schermopname van een niet-aaneengesloten tekstselectie, waarbij het eerste teken en de laatste vijf tekens zijn geselecteerd.

Werken met tekst

Met de klasse CoreTextEditContext kunt u de tekststroom tussen Windows en bewerkingselementen mogelijk maken via de TextUpdating-gebeurtenis, de TextRequested-gebeurtenis en de methode NotifyTextChanged.

Uw besturingselement voor bewerken ontvangt tekst via TextUpdating-gebeurtenissen die worden gegenereerd wanneer gebruikers interactie hebben met tekstinvoermethoden zoals toetsenborden, spraak of IME's.

Wanneer u tekst in het besturingselement bewerkt, bijvoorbeeld door tekst in het besturingselement te plakken, moet u Windows waarschuwen door NotifyTextChanged aan te roepen.

Als de tekstservice de nieuwe tekst vereist, wordt er een TextRequested-gebeurtenis gegenereerd. U moet de nieuwe tekst opgeven in de TextRequested-gebeurtenis-handler .

Tekstupdates accepteren

Het besturingselement voor bewerken moet doorgaans aanvragen voor tekstupdates accepteren omdat deze de tekst vertegenwoordigen die de gebruiker wil invoeren. In de TextUpdating-gebeurtenis-handler worden deze acties verwacht van uw bewerkingscontrole:

  1. Voeg de tekst in die is opgegeven in CoreTextUpdatingEventArgs.Text in de positie die is opgegeven in CoreTextTextUpdatingEventArgs.Range.
  2. Plaats de selectie op de positie die is opgegeven in CoreTextTextUpdatingEventArgs.NewSelection.
  3. Informeer het systeem dat de update is geslaagd door CoreTextTextUpdatingEventArgs.Result in te stellen op CoreTextTextUpdatingResult.Succeeded.

Dit is bijvoorbeeld de status van een invoerveld voordat de gebruiker 'd' typt. De invoegpositie bevindt zich op [10, 10].

Schermopname van een tekststroomdiagram met de invoegpositie op [10, 10], vóór een invoeging

Wanneer de gebruiker 'd' typt, wordt er een TextUpdating-gebeurtenis gegenereerd met de volgende CoreTextTextUpdatingEventArgs-gegevens :

Pas in het besturingselement bewerken de opgegeven wijzigingen toe en stel het resultaatin op Geslaagd. Dit is de status van het besturingselement nadat de wijzigingen zijn toegepast.

Schermopname van een tekststroomdiagram met de invoegpositie op \[11, 11\], na een invoeging

Tekstupdates negeren

Soms kunt u geen tekstupdates toepassen omdat het aangevraagde bereik zich in een gebied van het bewerkingsbesturingselement bevindt dat niet mag worden gewijzigd. In dit geval moet u geen wijzigingen toepassen. Stel in plaats daarvan het systeem op de hoogte dat de update is mislukt door CoreTextTextUpdatingEventArgs.Result in te stellen op CoreTextTextUpdatingResult.Failed.

Denk bijvoorbeeld aan een besturingselement voor bewerken dat alleen een e-mailadres accepteert. Spaties moeten worden geweigerd omdat e-mailadressen geen spaties kunnen bevatten. Wanneer TextUpdating-events worden getriggerd voor de spatiebalktoets, moet u eenvoudigweg Result instellen op Failed in uw bewerkingselement.

Tekstwijzigingen melden

Soms brengt het besturingselement voor bewerken wijzigingen aan in tekst, zoals wanneer tekst wordt geplakt of automatisch wordt gecorrigeerd. In deze gevallen moet u de tekstservices van deze wijzigingen op de hoogte stellen door de methode NotifyTextChanged aan te roepen.

Bijvoorbeeld, dit is de status van een bewerkingsveld voordat de gebruiker 'Wereld' plakt. De invoegpositie bevindt zich op [6, 6].

Schermopname van een tekststroomdiagram met de invoegpositie op [6, 6], vóór een invoeging

De gebruiker voert de plakactie en het bewerkingsbesturingselement uit nadat de wijzigingen zijn toegepast:

Schermopname van een tekststroomdiagram met de invoegpositie op \[11, 11\], na een invoeging

Als dit gebeurt, moet u NotifyTextChanged aanroepen met deze argumenten:

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

Een of meer TextRequested-gebeurtenissen worden gevolgd, waarmee u de tekst bijwerkt waarmee de tekstservices werken.

Tekstupdates overschrijven

In het bewerkingsveld wilt u mogelijk een tekstwijziging overschrijven om functies voor automatische correctie te bieden.

Denk bijvoorbeeld aan een besturingselement voor bewerken dat een correctiefunctie biedt waarmee contracties worden geformaliseerd. Dit is de status van de bewerkingscontrole voordat de gebruiker de spatiebalk typt om de correctie te activeren. De invoegpositie bevindt zich op [3, 3].

Schermopname van een tekststroomdiagram met de invoegpositie op [3, 3], vóór een invoeging

De gebruiker drukt op de spatietoets en er wordt een bijbehorende TextUpdating-gebeurtenis gegenereerd. Het bewerkingselement accepteert de tekstupdate. Dit is de status van het bewerkingsbesturingselement voor een kort moment voordat de correctie is voltooid. De invoegpositie bevindt zich op [4, 4].

Schermopname van een tekststroomdiagram met de invoegpositie op [4, 4], na een invoeging

Buiten de TextUpdating-gebeurtenishandler voert de bewerkingscontrole de volgende correctie uit. Dit is de status van de bewerkingscontrole nadat de correctie is voltooid. De invoegpositie bevindt zich op [5, 5].

Schermopname van een tekststroomdiagram met de invoegpositie op [5, 5]

Als dit gebeurt, moet u NotifyTextChanged aanroepen met deze argumenten:

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

Een of meer TextRequested-gebeurtenissen worden gevolgd, waarmee u de tekst bijwerkt waarmee de tekstservices werken.

Gevraagde tekst opgegeven

Het is belangrijk dat tekstservices over de juiste tekst beschikken om functies zoals automatische correctie of voorspelling te bieden, met name voor tekst die al in het besturingselement voor bewerken bestaat, van het laden van een document, bijvoorbeeld of tekst die is ingevoegd door het besturingselement bewerken, zoals uitgelegd in vorige secties. Wanneer een TextRequested-gebeurtenis wordt gegenereerd, moet u daarom de tekst opgeven die zich momenteel in het besturingselement bewerken bevindt voor het opgegeven bereik.

Er zijn momenten waarop het bereik in CoreTextTextRequest een bereik aangeeft dat uw besturingselement voor bewerken niet kan verwerken zoals het is. Het bereik is bijvoorbeeld groter dan de grootte van het bewerkingsbesturingselement op het moment van de TextRequested-gebeurtenis of het einde van het bereik valt buiten de grenzen. In deze gevallen moet je een passend bereik retourneren, wat meestal een subset van het aangevraagde bereik is.

Samples

Archiefvoorbeelden