2009-06-27 9 views
8

la documentación sobre esto son bastante mal hecha. Hay una serie de eventos que se pueden enganchar en monitorear y tomar el control de entrada de texto que se accede a través de la TextCompositionManager. Si quieres hacer algo como atrapar datos de deslizamiento de tarjeta, aquí es donde lo harías.Ayuda con los eventos de WPF TextCompositionManager

Hay tres eventos que la entrada de texto preocupación: 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 es borboteando (viajando desde el elemento UI enfocado a la ventana):

de túnel:

  • PreviewTextInputEvent
  • PreviewTextInputStartEvent
  • PreviewTextInputUpdateEvent

burbujeante:

  • TextInputEvent
  • TextInputStartEvent
  • TextInputUpdateEvent

Por lo tanto, dependiendo en qué parte del árbol lógico puede enchufarse en el TextCompositionManager, puede modificar estos eventos de texto antes de llegar al centro del evento, o simplemente verlos luego. Todo esto es bastante simple y claro en los documentos y en uso.


TL; DR

no puedo encontrar una definición digna 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.

Respuesta

17

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

  • clave estándar: caracteres imprimibles como 'a', 'A', '5', '%', de retroceso, y así sucesivamente.
  • clave Control: Ctrl + C, Ctrl + H, Ctrl + M, etc.
  • código de tecla decimal: cosas como Alt + teclado numérico 2 5 5 (código para IBM extendió-ASCII 255, que es espacio Unicode de no separación U + 00A0) y Alt + numpad 0 2 5 5 (para el código de Windows ANSI 255, que es Unicode U + 00FF). Probablemente también se aplican a Alt + teclado numérico más 2 6 3 B (para U + 263B), si usted tiene la Registry setting to enable it; No he confirmado esto. (Establecí 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 se presiona 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 dispara cada vez que se empieza 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 desencadena cuando termine de introducir la llave y el sistema sabe a ciencia cierta qué clave que ha introducido, por lo que siempre tiene información útil en los TextCompositionEventArgs. Este evento significa que el personaje está siendo realmente "mecanografiado" ahora (es decir, corresponde a cuando el personaje aparecería si estuvieras escribiendo en un TextBox).


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

clave estándar: Tan pronto como se pulsa la tecla, se obtiene una 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.

decimal código de la llave: Digamos que estás escribiendo Alt + teclado numérico 0 2 5 5. Tan pronto como se pulsa teclado numérico 0, se obtiene un evento TextInputStart, que le dice 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. (Este 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.

clave Dead: Como he mencionado anteriormente, no sé cómo probar esto. Si alguien tiene la respuesta, házmelo saber, y la incluiré aquí.

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


Mi impresión es que, para la mayoría de usos, TextInput es el único de estos eventos que tiene sentido utilizar (ya que los otros dos no siempre le dirá 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.

+0

Guau, esa es una respuesta espectacular. Se gradúa suma cum laude. Estoy marcando su respuesta como satisfactoria, pero revise la siguiente pregunta relacionada que podría ayudarme: http://stackoverflow.com/questions/1053533/how-can-i-prevent-input-controls-from- robar el espacio-personaje-del-texto – Will

+0

He intentado los eventos de vista previa para las teclas muertas. Cuando presiono '~', obtengo un evento 'PreviewTextInputStart' con' Text = ~ '. Luego, cuando presiono 'a', obtengo un' PreviewTextInputUpdate' seguido de 'PreviewTextInput' con' Text = ã'. Para los eventos 'TextInput', obtengo un resultado similar pero nunca se llama al evento' TextInput'. De hecho, nunca recibo el evento 'TextInput' ni siquiera para las teclas simples (como' a') – luiscubal

+0

Esto ocurre para un TextBox, al menos. Aquí está el orden de los eventos y las correspondientes propiedades de 'Texto': https://gist.github.com/luiscubal/9691303 – luiscubal

Cuestiones relacionadas