Escribo un control personalizado y me gustaría que el control cambie de un estado de edición a su estado normal cuando un usuario hace clic fuera del control. Estoy manejando el evento LostFocus y eso ayuda cuando un usuario hace pestañas o si hacen clic en otro control enfocable. Pero si no hacen clic en algo Focusable, no cambiará de su estado de edición. Así que tengo dos soluciones en mente:¿Cómo puede un control controlar un clic del mouse fuera de ese control?
- caminar hasta el árbol hasta la cima más elemento cuando entra a un estado de edición y agregar un controlador para
MouseDownEvent
(y mango "manejado" eventos). En el controlador, quitaría el control de su estado de edición y eliminaría el controlador del elemento superior. Parece un truco, pero probablemente funcione bien.
código Ejemplo:
private void RegisterTopMostParentMouseClickEvent()
{
_topMostParent = this.FindLastVisualAncestor<FrameworkElement>();
if (_topMostParent == null)
return;
_topMostParent.AddHandler(Mouse.MouseDownEvent, new MouseButtonEventHandler(CustomControlMouseDownEvent), true);
}
private void UnRegisterTopMostParentMouseClickEvent()
{
if (_topMostParent == null)
return;
_topMostParent.RemoveHandler(Mouse.MouseDownEvent, new MouseButtonEventHandler(CustomControlMouseDownEvent));
_topMostParent = null;
}
- Uso
Mouse.PreviewMouseDownOutsideCapturedElement
y agregar un controlador de mi control. En el controlador, patearía el control fuera de su estado de edición. Pero parece que no tengo el evento para disparar. ¿Cuándo se inicia el Mouse.PreviewMouseDownOutsideCapturedElement?
código Ejemplo:
AddHandler(Mouse.PreviewMouseDownOutsideCapturedElementEvent, new MouseButtonEventHandler(EditableTextBlockPreviewMouseDownOutsideCapturedElementEvent), true);
Así que funcionó a la perfección. Todo lo que tuve que hacer fue capturar el mouse cuando entré al modo de edición, luego WPF quita automáticamente el foco del elemento cuando haces clic fuera de él. Después de perder el foco, tuve que tener cuidado con ReleaseMouseCapture(). ¡Gracias! – chrislarson
La única otra cosa que tuve que tener cuidado fue cuando presionas la tecla de Windows o se inicia otra aplicación, perdería la captura del mouse sin que esto impidiera que mi control estuviera en estado de edición. Así que tuve que manejar el evento IsMouseCapturedChanged. Por ejemplo, 'private void CustomControlIsMouseCapturedChanged (object sender, DependencyPropertyChangedEventArgs e) { if ((bool) e.NewValue == false) { IsEditing = false; } } ' – chrislarson