¿Cómo resuelve este problema de LostFocus / LostKeyboardFocus?

Ok, tengo un control que tiene una propiedad IsEditing que, por el bien del argumento, tiene una plantilla predeterminada que normalmente es un bloque de texto, pero cuando IsEditing es verdadero, se intercambia en un cuadro de texto para la edición en el lugar. Ahora, cuando el control pierde el foco, si todavía está editando, se supone que debe abandonar el modo de edición y volver a cambiar en la plantilla TextBlock. Bastante sencillo, ¿verdad?

Piense en el comportamiento de cambiar el nombre de un archivo en el Explorador de Windows o en su escritorio (que es lo mismo que sé ...) Ese es el comportamiento que queremos.

El problema es que no puede usar el evento LostFocus porque cuando cambia a otra ventana (o elemento que es un FocusManager) LostFocus no se activa ya que el control todavía tiene un enfoque lógico, por lo que no funcionará.

Si en su lugar usa LostKeyboardFocus, si bien eso resuelve el problema 'otro FocusManager', ahora tiene uno nuevo: cuando está editando y hace clic derecho en el cuadro de texto para mostrar el menú contextual, porque el menú contextual ahora tiene foco del teclado, su control pierde el foco del teclado, abandona el modo de edición y cierra el menú contextual, confundiendo al usuario.

Ahora he intentado configurar una bandera para ignorar el LostKeyboardFocus justo antes de que se abra el menú, y luego usar ese fiag en el evento LostKeyboardFocus para determinar si se debe sacar del modo de edición o no, pero si el menú está abierto y hago clic en otro lugar la aplicación, dado que el control ya no tenía el foco del teclado (el menú lo tenía), el control nunca obtiene otro evento LostKeyboardFocus, por lo que permanece en modo de edición. (Puede que tenga que agregar una marca de verificación cuando se cierra el menú para ver qué tiene el foco y luego eliminarlo manualmente del Modo de edición si no es el control. Eso parece prometedor).

Entonces, ¿alguien tiene alguna idea de cómo puedo codificar con éxito este comportamiento?

Marc

Respuestas a la pregunta(6)

Su respuesta a la pregunta