wpf events textinput textcompositionmanager

Ayuda con los eventos de WPF TextCompositionManager



events textinput (1)

Los documentos sobre esto son bastante de mala calidad. Hay una serie de eventos que puede enganchar para monitorear y tomar el control de la entrada de texto a la que se accede a través de TextCompositionManager . Si quieres hacer algo como atrapar datos de deslizamiento de tarjeta, aquí es donde lo harías.

Hay tres eventos relacionados con el ingreso de texto: TextInput , TextStart y TextUpdate . Hay dos versiones de cada evento, una donde el evento es tunelización (bajando desde la ventana al control que tiene foco) y cuando está burbujeando (viajando desde el elemento UI enfocado a la ventana):

Túneles:

  • PreviewTextInputEvent
  • PreviewTextInputStartEvent
  • PreviewTextInputUpdateEvent

Burbujeando

  • TextInputEvent
  • TextInputStartEvent
  • TextInputUpdateEvent

Entonces, dependiendo de en qué árbol lógico se enganche en el TextCompositionManager, puede modificar estos eventos de texto antes de que lleguen al centro del evento o simplemente verlos después. Todo esto es bastante simple y claro en los documentos y en uso.

TL; DR

No puedo encontrar una definición decente de los tres eventos. Una respuesta aceptable no solo definirá los tres eventos (TextInput, TextInputStart y TextInputUpdate), sino que también los comparará y contrastará. Sin compartir las respuestas, consulte sus fuentes y la Wikipedia no está permitida. El 25% de tu calificación depende de esto.


Las diferencias entre ellos dependen del tipo de personaje que estás escribiendo.

  • Clave estándar: caracteres imprimibles como ''a'', ''A'', ''5'', ''%'', Retroceso, y así sucesivamente.
  • Tecla de control: Ctrl + C, Ctrl + H, Ctrl + M, etc.
  • Código de clave decimal: cosas como Alt + teclado numérico 2 5 5 (para IBM extendido código ASCII 255, que es espacio de no separación Unicode U + 00A0) y Alt + teclado numérico 0 2 5 5 (para Windows ANSI código 255, que es Unicode U + 00FF). Probablemente también se aplicaría a Alt + teclado numérico más 2 6 3 B (para U + 263B) si tiene la configuración del Registro para habilitarlo ; No he confirmado esto. (Configuré la configuración del Registro pero no tuvo efecto inmediato, probablemente requiera un reinicio).
  • Llaves muertas: entiendo que los teclados multilingües tienen elementos adicionales llamados "teclas muertas" que modifican la siguiente pulsación de tecla. Por ejemplo, puede presionar la tecla muerta "umlaut", seguida de "o", que podría "escribir" un ö (o con diéresis). (Puedo tener los detalles equivocados. Siempre he usado un teclado en-US y no sé cómo se necesita para usar las teclas muertas.) Sospecho que se comportarían de manera similar a los códigos de clave decimales; vea abajo.
  • IME: los lenguajes ideográficos utilizan algo llamado "Editor de métodos de entrada". Sé menos sobre esto que sobre las llaves muertas, y no tengo idea si disparan estos eventos o no.

Tenga en cuenta que las teclas modificadoras como Shift y Ctrl no activan estos eventos directamente (a diferencia de KeyDown donde se ve presionado el Shift, luego presionando el 5, etc.). Por ejemplo, Shift + 5, para obtener "%", solo genera una secuencia de eventos (es decir, un TextInputStart y un TextInput), y ambos reciben la cadena "%".

TextInputStart se activa cada vez que comienza a escribir un código de carácter o carácter. Se dispara cuando presiona una tecla estándar, una tecla de control o el primer dígito de un código de tecla decimal. Cuando se dispara, el sistema a veces, pero no siempre, ya sabe qué tecla está presionando (como en el caso de las teclas estándar y las teclas de control). Si sabe, le dirá en el TextCompositionEventArgs; si no lo sabe, TextCompositionEventArgs está vacío y no le dice nada en absoluto.

TextInputUpdate se activa cuando ingresa el segundo y siguientes dígitos de un código de clave decimal. Aún no he visto nada salvo un TextCompositionEventArgs vacío para este evento (aunque es posible que eso cambie con claves muertas o IME).

TextInput se activa cuando termina de ingresar la clave, y el sistema sabe con certeza qué clave ingresó, por lo que siempre tiene información útil en TextCompositionEventArgs. Este evento significa que el personaje está siendo "mecanografiado" ahora (es decir, corresponde a cuando el personaje aparecería si estuvieras escribiendo en un TextBox).

Así es como funcionan las secuencias de eventos para diferentes tipos de personajes:

Clave estándar: tan pronto como presiona la tecla, obtiene un TextInputStart seguido inmediatamente por un TextInput. Ambos tienen el mismo contenido en sus TextCompositionEventArgs: e.Text y e.TextComposition.Text se configuran con la tecla presionada. (Tenga en cuenta que esto no siempre es un carácter imprimible. Si presiona Retroceso, estará en e.Text). Si mantiene presionada la tecla, obtendrá el par de eventos (TextInputStart / TextInput) para cada repetición de tecla.

Tecla de control: tan pronto como presiona la tecla de la letra, obtiene un TextInputStart inmediatamente seguido de un TextInput. Ambos tienen el mismo contenido en sus TextCompositionEventArgs: e.ControlText y e.TextComposition.ControlText se configuran con la tecla de control presionada. Si mantiene presionada la tecla de la letra, obtendrá el par de eventos (TextInputStart / TextInput) para cada repetición de tecla.

Código de clave decimal: digamos que está escribiendo Alt + teclado numérico 0 2 5 5. Tan pronto como presione el teclado numérico 0, obtendrá un evento TextInputStart, que no le indica absolutamente nada útil. Para cada una de las teclas numpad 2, teclado numérico 5 y teclado numérico 5, se obtiene un evento TextInputUpdate, nuevamente sin información útil (no se puede decir qué dígitos se han pulsado hasta ahora). Cuando sueltas la tecla Alt (que en realidad "teclea" la clave cuyo código ingresaste), obtienes el evento TextInput con la clave que ingresaste en las propiedades e.Text y e.TextComposition.Text. (Puede ser un carácter no imprimible, por ejemplo, si ingresó Alt + teclado numérico 0 8.) La repetición de teclas no es posible para los códigos de teclas decimales.

Llave muerta: como mencioné anteriormente, no sé cómo probar esto. Si alguien tiene la respuesta, házmelo saber, y la incluiré aquí.

IME: Nuevamente, no sé cómo probar esto.

Mi impresión es que, para la mayoría de los usos, TextInput es el único de estos eventos que tiene sentido usar (ya que los otros dos no siempre te dicen nada). Probablemente sea por eso que es el único de los tres que se vuelve a exponer como un evento enrutado estándar (no adjunto) en UIElement, UIElement3D y ContentElement.