Share via


Saisie de texte personnalisé

Les API de texte principales de l’espace de noms Windows.UI.Text.Core permettent à une application Windows de recevoir une entrée de texte à partir de n’importe quel service de texte pris en charge sur les appareils Windows. Ces API sont similaires aux API Structure des services de texte, dans la mesure où l’application n’a pas besoin de connaissances détaillées des services de texte. Cela permet à l’application de recevoir du texte dans n’importe quelle langue et à partir de n’importe quel type d’entrée, comme la saisie sur clavier, la saisie vocale ou la saisie à l’aide d’un stylet.

API importantes : Windows.UI.Text.Core, CoreTextEditContext

Pourquoi utiliser les API Core Text ?

Pour de nombreuses applications, les contrôles de zone de texte XAML ou HTML sont suffisants pour la saisie et l’édition de texte. Toutefois, si votre application gère les scénarios de texte complexes, comme une application de traitement de texte, vous aurez peut-être besoin d’un contrôle d’édition de texte personnalisé. Vous pouvez utiliser les API de clavier CoreWindow pour créer votre contrôle d’édition de texte, mais elles ne permettent pas de recevoir une entrée de texte basée sur la composition, ce qui est nécessaire pour prendre en charge les langues d’Asie de l’Est.

Si vous avez besoin de créer un système de contrôle d’édition de texte, utilisez plutôt les API Windows.UI.Text.Core. Ces API sont conçues pour vous offrir une grande souplesse dans le traitement de la saisie de texte, dans n’importe quelle langue. Elles vous permettent également de bénéficier de l’expérience de texte la plus adaptée à votre application. Les contrôles de saisie et d’édition de texte conçus avec les API Core Text peuvent recevoir du texte à partir de toutes les méthodes de saisie de texte qui existent sur les appareils Windows, des éditeurs de méthode d’entrée (IME) basés sur la structure des services de texte et de l’écriture manuscrite sur PC au clavier WordFlow (qui offre des fonctionnalités de correction automatique, de prédiction et de dictée) sur les appareils mobiles.

Architecture

Voici une représentation simple du système de saisie de texte.

  • « Application » représente une application Windows hébergeant un contrôle d’édition personnalisé créé à l’aide des API de texte principales.
  • Les API Windows.UI.Text.Core facilitent la communication avec les services de texte via Windows. La communication entre le contrôle d’édition de texte et les services de texte est gérée principalement via un objet CoreTextEditContext qui fournit les méthodes et événements visant à faciliter la communication.

Diagramme d’architecture CoreText

Sélection et plages de texte

Les contrôles d’édition fournissent un espace pour la saisie de texte et les utilisateurs peuvent modifier du texte n’importe où dans cet espace. Cet article vise à présenter le système de positionnement de texte utilisé par l’API Core Text, ainsi que la représentation des plages et des sélections dans ce système.

Position d’insertion de l’application

Les plages de texte utilisées avec les API Core Text sont exprimées en termes de position d’insertion. La « position d’insertion de l’application (ACP) » est un nombre (basé sur zéro) indiquant le nombre de caractères à partir du début du texte, juste avant le point d’insertion, comme indiqué ici.

Capture d’écran montrant le nombre de caractères ACP (Application Caret Position)

Sélection et plages de texte

Les plages de texte et les sélections sont représentées par la structure CoreTextRange qui contient deux champs :

Champ Type de données Description
StartCaretPosition Nombre [JavaScript] | System.Int32 [.NET] | int32 [C++] La position de départ d’une plage correspond à l’ACP située juste avant le premier caractère.
EndCaretPosition Nombre [JavaScript] | System.Int32 [.NET] | int32 [C++] La position de fin d’une plage correspond à l’ACP située juste après le dernier caractère.

 

Par exemple, dans la plage de texte indiquée précédemment, la plage [0, 5] spécifie le mot « Hello ». StartCaretPosition doit toujours être inférieur ou égal à EndCaretPosition. La plage [5, 0] n’est pas valide.

Point d’insertion

La position d’insertion actuelle, souvent appelée « point d’insertion », est représentée par la définition d’un champ StartCaretPosition égal au champ EndCaretPosition.

Sélection non contiguë

Certains contrôles d’édition prennent en charge les sélections non contiguës. Par exemple, les applications Microsoft Office prennent en charge les sélections arbitraires multiples, et de nombreux éditeurs de code source permettent la sélection de colonnes. Toutefois, les API de texte de base ne prennent pas en charge les sélections non contiguës. Les contrôles d’édition doivent uniquement signaler une sélection contiguë, qui correspond le plus souvent à la sous-plage active des sélections non contiguës.

Par exemple, l’image suivante montre un flux de texte avec deux sélections non contiguës : [0, 1] et [6, 11] pour lesquelles le contrôle d’édition ne doit en signaler qu’une seule ([0, 1] ou [6, 11]).

Capture d’écran montrant une sélection de texte non contiguë, où le premier caractère et les cinq derniers caractères sont sélectionnés.

Utilisation du texte

La classe CoreTextEditContext permet un flux de texte entre Windows et les contrôles d’édition via l’événement TextUpdating, l’événement TextRequested et la méthode NotifyTextChanged.

Votre système de contrôle d’édition reçoit le texte via les événements TextUpdating qui sont générés lorsque les utilisateurs utilisent les méthodes de saisie de texte telles que les claviers, la saisie vocale ou les éditeurs IME.

Lorsque vous modifiez du texte dans votre contrôle d’édition, par exemple, en collant du texte dans le contrôle, vous devez informer Windows en appelant NotifyTextChanged.

Si le service de texte a besoin du nouveau texte, un événement TextRequested est déclenché. Vous devez indiquer le nouveau texte dans le gestionnaire d’événements TextRequested.

Accepter des mises à jour de texte

Votre système de contrôle d’édition accepte généralement les demandes de mises à jour de texte, dans la mesure où elles contiennent le texte que l’utilisateur souhaite saisir. Dans le gestionnaire d’événements TextUpdating , ces actions sont attendues de votre contrôle d’édition :

  1. Insérez le texte spécifié dans CoreTextTextUpdatingEventArgs.Text à la position spécifiée dans CoreTextTextUpdatingEventArgs.Range.
  2. Placer la sélection à la position indiquée dans CoreTextTextUpdatingEventArgs.NewSelection.
  3. Indiquer au système que la mise à jour a été correctement effectuée en définissant CoreTextTextUpdatingEventArgs.Result sur CoreTextTextUpdatingResult.Succeeded.

Par exemple, voici l’état d’un contrôle d’édition avant que l’utilisateur tape « d ». Le point d’insertion est à [10, 10].

Capture d’écran d’un diagramme de flux de texte montrant le point d’insertion à [10, 10], avant une insertion

Lorsque l’utilisateur tape « d », un événement TextUpdating est déclenché avec les données CoreTextTextUpdatingEventArgs suivantes :

Dans votre système de contrôle d’édition, appliquez les modifications indiquées et définissez Result sur Succeeded. Voici l’état du contrôle une fois que les modifications sont appliquées.

Capture d’écran d’un diagramme de flux de texte montrant le point d’insertion à \[11, 11\], après une insertion

Refuser des mises à jour de texte

Il vous est parfois impossible d’appliquer les mises à jour de texte, car la plage concernée est une zone du contrôle d’édition qui ne doit pas être modifiée. Dans ce cas, vous ne devez pas appliquer les modifications. Au lieu de cela, indiquez au système que la mise à jour a échoué en définissant CoreTextTextUpdatingEventArgs.Result sur CoreTextTextUpdatingResult.Failed.

Par exemple, imaginons un système de contrôle d’édition qui accepte uniquement une adresse de messagerie. Les espaces doivent être rejetés, car les adresses de messagerie ne peuvent pas contenir d’espaces. De ce fait, quand des événements TextUpdating sont déclenchés pour la touche Espace, il vous suffit de définir Result sur Failed dans votre système de contrôle d’édition.

Signaler des modifications de texte

Parfois, votre système de contrôle d’édition apporte des modifications au texte lorsque le texte est collé ou corrigé automatiquement. Dans ce cas, vous devez informer les services de texte de ces modifications en appelant la méthode NotifyTextChanged .

Par exemple, voici l’état d’un contrôle d’édition avant que l’utilisateur colle le mot « World ». Le point d’insertion est à [6, 6].

Capture d’écran d’un diagramme de flux de texte montrant le point d’insertion à [6, 6], avant une insertion

L’utilisateur effectue l’action coller et le contrôle de modification une fois les modifications appliquées :

Capture d’écran d’un diagramme de flux de texte montrant le point d’insertion à \[11, 11\], après une insertion

Dans ce cas, vous devez appeler NotifyTextChanged avec les arguments suivants :

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

Un ou plusieurs événements TextRequested suivront, que vous gérez pour mettre à jour le texte avec lequel les services de texte travaillent.

Ignorer des mises à jour de texte

Dans votre système de contrôle d’édition, vous souhaiterez peut-être ignorer une mise à jour de texte pour utiliser des fonctionnalités de correction automatique.

Par exemple, imaginons un système de contrôle d’édition qui fournit une fonctionnalité de correction qui formalise les contractions. Voici l’état du contrôle d’édition avant que l’utilisateur appuie sur la touche Espace pour déclencher la correction. Le point d’insertion est à [3, 3].

Capture d’écran d’un diagramme de flux de texte montrant le point d’insertion à [3, 3], avant une insertion

L’utilisateur appuie sur la touche d’espace et un événement TextUpdating correspondant est déclenché. Le système de contrôle d’édition accepte la mise à jour de texte. Voici l’état que le contrôle d’édition affiche pendant un court instant avant la fin de la correction. Le point d’insertion est à [4, 4].

Capture d’écran d’un diagramme de flux de texte montrant le point d’insertion à [4, 4], après une insertion

En dehors du gestionnaire d’événements TextUpdating , le contrôle d’édition apporte la correction suivante. Voici l’état du contrôle d’édition après la fin de la correction. Le point d’insertion est à [5, 5].

Capture d’écran d’un diagramme de flux de texte montrant le point d’insertion à [5, 5]

Dans ce cas, vous devez appeler NotifyTextChanged avec les arguments suivants :

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

Un ou plusieurs événements TextRequested suivront, que vous gérez pour mettre à jour le texte avec lequel les services de texte travaillent.

Fournir le texte demandé

Les services de texte doivent disposer du texte approprié pour proposer des fonctionnalités comme la correction automatique ou la prédiction, en particulier si le texte existait déjà dans le système de contrôle d’édition, par exemple parce qu’il avait été créé lors du chargement d’un document, ou parce qu’il avait été inséré par le système de contrôle d’édition comme expliqué dans les sections précédentes. Par conséquent, chaque fois qu’un événement TextRequested est déclenché, vous devez fournir le texte actuellement dans votre contrôle d’édition pour la plage spécifiée.

Il se peut que la plage dans CoreTextTextRequest spécifie une plage que votre contrôle d’édition ne peut pas prendre en charge telle quel. C’est par exemple le cas si le Range est supérieur à la taille du contrôle d’édition au moment de l’événement TextRequested ou si la fin du Range est hors limites. Dans ces cas, vous devez indiquer la plage adéquate, qui correspond généralement à un sous-ensemble de la plage requise.

Exemples

Exemples d’archive