Compartir a través de


Entrada de texto personalizado

Las API de texto principal del espacio de nombres Windows.UI.Text.Core permiten que una aplicación de Windows reciba la entrada de texto de cualquier servicio de texto compatible con dispositivos Windows. Las API son similares a las API de Text Services Framework en que la aplicación no es necesaria para tener conocimientos detallados de los servicios de texto. Esto permite a la aplicación recibir texto en cualquier idioma y desde cualquier tipo de entrada, como teclado, voz o lápiz.

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

¿Por qué usar las API de texto principal?

Para muchas aplicaciones, los controles de cuadro de texto XAML o HTML son suficientes para la entrada y edición de texto. Sin embargo, si la aplicación controla escenarios de texto complejos, como una aplicación de procesamiento de texto, es posible que necesite la flexibilidad de un control de edición de texto personalizado. Puede usar las API de teclado CoreWindow para crear el control de edición de texto, pero no proporcionan una manera de recibir entradas de texto basadas en composición, lo que es necesario para admitir idiomas asiáticos orientales.

En su lugar, use las API Windows.UI.Text.Core cuando necesite crear un control de edición de texto personalizado. Estas API están diseñadas para ofrecerle una gran flexibilidad en el procesamiento de la entrada de texto, en cualquier idioma y le permiten proporcionar la experiencia de texto más adecuada para la aplicación. Los controles de entrada y edición de texto creados con las API de texto principales pueden recibir entradas de texto de todos los métodos de entrada de texto existentes en dispositivos Windows, desde editores de métodos de entrada basados en Text Services Framework (IME) y escritura a mano en equipos con el teclado WordFlow (que proporciona corrección automática, predicción y dictado) en dispositivos móviles.

Arquitectura

A continuación se muestra una representación sencilla del sistema de entrada de texto.

  • "Aplicación" representa una aplicación de Windows que hospeda un control de edición personalizado creado mediante las API de texto principales.
  • Las API Windows.UI.Text.Core facilitan la comunicación con los servicios de texto a través de Windows. La comunicación entre el control de edición de texto y los servicios de texto se controla principalmente a través de un objeto CoreTextEditContext que proporciona los métodos y eventos para facilitar la comunicación.

Diagrama de arquitectura de CoreText

Intervalos de texto y selección

Los controles de edición proporcionan espacio para la entrada de texto y los usuarios esperan editar texto en cualquier parte de este espacio. Aquí se explica el sistema de posicionamiento de texto usado por las API de texto principal y cómo se representan los intervalos y selecciones en este sistema.

Posición del símbolo de intercalación de la aplicación

Los intervalos de texto usados con las API de texto principal se expresan en términos de posiciones de intercalación. Una "Posición de intercalación de aplicaciones (ACP)" es un número de base cero que indica el recuento de caracteres desde el principio de la secuencia de texto inmediatamente antes del símbolo de intercalación, como se muestra aquí.

Captura de pantalla que muestra el recuento de caracteres de posición de intercalación de aplicaciones (ACP)

Intervalos de texto y selección

Los intervalos de texto y las selecciones se representan mediante la estructura CoreTextRange que contiene dos campos:

Campo Tipo de datos Descripción
StartCaretPosition Número [JavaScript] | System.Int32 [.NET] | int32 [C++] La posición inicial de un rango es el ACP inmediatamente antes del primer carácter.
EndCaretPosition Número [JavaScript] | System.Int32 [.NET] | int32 [C++] La posición final de un rango es el ACP inmediatamente después del último carácter.

 

Por ejemplo, en el intervalo de texto mostrado anteriormente, el intervalo [0, 5] especifica la palabra "Hello". StartCaretPosition siempre debe ser menor o igual que EndCaretPosition. El intervalo [5, 0] no es válido.

Punto de inserción

La posición del símbolo de intercalación actual, que se conoce con frecuencia como punto de inserción, se representa estableciendo StartCaretPosition como igual a EndCaretPosition.

Selección no contigua

Algunos controles de edición admiten selecciones no contiguosas. Por ejemplo, Microsoft aplicación de Office admite varias selecciones arbitrarias y muchos editores de código fuente admiten la selección de columnas. Sin embargo, las API de texto principal no admiten selecciones no contiguas. Los controles de edición solo deben notificar una única selección contigua, con más frecuencia el sub intervalo activo de las selecciones no contiguas.

Por ejemplo, en la imagen siguiente se muestra una secuencia de texto con dos selecciones no contiguas: [0, 1] y [6, 11] para las que el control de edición debe notificar solo una (ya sea [0, 1] o [6, 11]).

Captura de pantalla que muestra una selección de texto no contigua, donde se seleccionan el primer carácter y los cinco últimos caracteres.

Trabajar con texto

La clase CoreTextEditContext habilita el flujo de texto entre Windows y los controles de edición a través del evento TextUpdating, el evento TextRequested y el método NotifyTextChanged.

El control de edición recibe texto a través de eventos TextUpdating que se generan cuando los usuarios interactúan con métodos de entrada de texto como teclados, voz o IME.

Al cambiar el texto del control de edición, por ejemplo, pegando texto en el control, debe notificar a Windows llamando a NotifyTextChanged.

Si el servicio de texto requiere el nuevo texto, se genera un evento TextRequested. Debe proporcionar el nuevo texto en el controlador de eventos TextRequested .

Aceptar actualizaciones de texto

El control de edición normalmente debe aceptar solicitudes de actualización de texto porque representan el texto que el usuario quiere escribir. En el controlador de eventos TextUpdating , se esperan estas acciones del control de edición:

  1. Inserte el texto especificado en CoreTextTextUpdatingEventArgs.Text en la posición especificada en CoreTextTextUpdatingEventArgs.Range.
  2. Coloque la selección en la posición especificada en CoreTextTextUpdatingEventArgs.NewSelection.
  3. Notifique al sistema que la actualización se realizó correctamente estableciendo CoreTextTextUpdatingEventArgs.Result en CoreTextTextUpdatingResult.Succeeded.

Por ejemplo, este es el estado de un control de edición antes de que el usuario escriba "d". El punto de inserción está en [10, 10].

Captura de pantalla de un diagrama de flujo de texto que muestra el punto de inserción en [10, 10], antes de una inserción

Cuando el usuario escribe "d", se genera un evento TextUpdating con los siguientes datos CoreTextTextUpdatingEventArgs:

En el control de edición, aplique los cambios especificados y establezca Resultado en Correcto. Este es el estado del control después de aplicar los cambios.

Captura de pantalla de un diagrama de flujo de texto que muestra el punto de inserción en \[11, 11\], después de una inserción

Rechazar actualizaciones de texto

A veces, no se pueden aplicar actualizaciones de texto porque el intervalo solicitado está en un área del control de edición que no se debe cambiar. En este caso, no debe aplicar ningún cambio. En su lugar, notifique al sistema que la actualización produjo un error estableciendo CoreTextTextUpdatingEventArgs.Result en CoreTextTextUpdatingResult.Failed.

Por ejemplo, considere un control de edición que acepte solo una dirección de correo electrónico. Los espacios deben rechazarse porque las direcciones de correo electrónico no pueden contener espacios, por lo que cuando se generan eventos TextUpdating para la clave de espacio, simplemente debe establecer Resultado en Error en el control de edición.

Notificación de cambios de texto

A veces, el control de edición realiza cambios en el texto, como cuando el texto se pega o se corrige automáticamente. En estos casos, debe notificar a los servicios de texto de estos cambios llamando al método NotifyTextChanged.

Por ejemplo, este es el estado de un control de edición antes de que el usuario pegue "Mundo". El punto de inserción está en [6, 6].

Captura de pantalla de un diagrama de flujo de texto que muestra el punto de inserción en [6, 6], antes de una inserción

El usuario realiza la acción pegar y el control de edición después de aplicar los cambios:

Captura de pantalla de un diagrama de flujo de texto que muestra el punto de inserción en \[11, 11\], después de una inserción

Cuando esto sucede, debe llamar a NotifyTextChanged con estos argumentos:

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

Se seguirán uno o varios eventos TextRequested , con los que controlará actualizar el texto con el que trabajan los servicios de texto.

Invalidación de actualizaciones de texto

En el control de edición, es posible que desee invalidar una actualización de texto para proporcionar características de corrección automática.

Por ejemplo, considere un control de edición que proporciona una característica de corrección que formaliza las contracciones. Este es el estado del control de edición antes de que el usuario escribe la clave de espacio para desencadenar la corrección. El punto de inserción está en [3, 3].

Captura de pantalla de un diagrama de flujo de texto que muestra el punto de inserción en [3, 3], antes de una inserción

El usuario presiona la tecla de espacio y se genera un evento TextUpdating correspondiente. El control de edición acepta la actualización de texto. Este es el estado del control de edición durante un breve momento antes de que se complete la corrección. El punto de inserción está en [4, 4].

Captura de pantalla de un diagrama de flujo de texto que muestra el punto de inserción en [4, 4], después de una inserción

Fuera del controlador de eventos TextUpdating , el control de edición realiza la siguiente corrección. Este es el estado del control de edición una vez completada la corrección. El punto de inserción está en [5, 5].

Captura de pantalla de un diagrama de flujo de texto que muestra el punto de inserción en [5, 5]

Cuando esto sucede, debe llamar a NotifyTextChanged con estos argumentos:

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

Se seguirán uno o varios eventos TextRequested , con los que controlará actualizar el texto con el que trabajan los servicios de texto.

Proporcionar texto solicitado

Es importante que los servicios de texto tengan el texto correcto para proporcionar características como la corrección automática o la predicción, especialmente para el texto que ya existía en el control de edición, desde la carga de un documento, por ejemplo, o el texto insertado por el control de edición, como se explica en las secciones anteriores. Por lo tanto, siempre que se genere un evento TextRequested , debe proporcionar el texto actualmente en el control de edición para el intervalo especificado.

Habrá veces que range in CoreTextTextRequest especifica un intervalo que el control de edición no puede acomodar tal como está. Por ejemplo, el intervalo es mayor que el tamaño del control de edición en el momento del evento TextRequested o el final del intervalo está fuera de los límites. En estos casos, debe devolver cualquier rango que tenga sentido, que suele ser un subconjunto del intervalo solicitado.

Ejemplos

Ejemplos de archivo