2008-12-01 21 views

Respuesta

6

He encontrado una solución razonable, me puse el foco en el menú principal de forma manual:

EDIT: Como sugiere @TcKs, he cambiado el evento desde ItemClicked a MenuActivate. Muchas gracias por ayuda!

private void menuStrip1_MenuActivate(object sender, EventArgs e) 
    { 
     menuStrip1.Focus(); 
    } 
+0

Funciona solo para mouse, pero no para teclado. Por favor mira mi edición. – TcKs

2

Debe usar los eventos "Validating" y "Validated" para verificar la entrada del usuario. Luego, si el usuario va a otro control "A", y el control "A" tiene la propiedad "CausesValidating" configurada en "true" (su valor predeterminado), se dispararán los eventos "Validating" y "Validated".

El menú también tiene la propiedad "CuasesValidating".

Editar: Lo siento, se olvidó de la "CuasesValidating" en la banda de menú es nuestra funcionalidad y no incorporado. Pero la comprobación de validación es bastante simple:

private void menuStrip1_MenuActivate(object sender, EventArgs e) { 
    bool ret = this.Validate(false); 
    if (false == ret) { 
     // user's input is wrong 
    } 
} 

usuario cualquiera ContainerControl en lugar de "este", si desea comprobar la validación en otro control que el "este" formulario. Por ejemplo, en la ventana MDI Child.

+0

no puedo encontrar la propiedad CausesValidating en el ToolStripMenuItem o la menustrip ... – Stefan

+0

no puedo encontrar la propiedad CausesValidating en el ToolStripMenuItem así – Grzenio

0

cuando se juega con un menú, que tiene que simular, de alguna manera, un LostFocus y tal vez recordar donde estaba en caso de cerrar el menú sin hacer nada por lo que el enfoque volvería en el cuadro de texto

1

hay algunos casos cuando Lostfocus no se activa, por ejemplo, haciendo clic en los botones de la barra de herramientas y en los elementos del menú. Utilizo para solucionar esto con una variable local "LastControl" y lo manejo yo mismo cuando el menú tiene foco.

Existen razones por las que el clic del menú no pierde el foco del cuadro de texto. Si desea tener, por ejemplo, un menú "Editar" con "Pegar", la opción "Pegar" debe actuar en contra del control que tiene el foco y por eso no debe robar el foco de ningún control en el formulario.

Por lo tanto, el menú se puede ver como un menú contextual que no roba el foco del control.

+0

Es justo que el menú no elimine el foco del control, pero, por otro lado, no hay un mecanismo para manejar mi escenario de una manera razonablemente simple. Su método está bien en casos simples, pero tengo una jerarquía de controles de usuario utilizados en diferentes formularios, así que realmente no puedo tener LastControl – Grzenio

+0

Sí, estaba listo para publicar un ejemplo que dinámicamente reenvió un InvokeLostFocus (LastControl) cuando el menú fue activado Pero luego vi su solución con menustrip1.focus() así que no lo hice. ;) – Stefan

-1

necesita un pixel etiqueta de 1 píxel por 1

Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave 
    MsgBox("yes") 
End Sub 

Private Sub MenuStrip1_MenuActivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuActivate 
    CType(sender, MenuStrip).Tag = ActiveControl 
    Label1.Focus() 
End Sub 

Private Sub MenuStrip1_MenuDeactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuDeactivate 
    If CType(sender, MenuStrip).Tag Is Control AndAlso CType(CType(sender, MenuStrip).Tag, Control).CanFocus Then 
     CType(CType(sender, MenuStrip).Tag, Control).Focus() 
    End If 
    CType(sender, MenuStrip).Tag = Nothing 
End Sub 
+0

Sé que es código VB.Net, pero debería ser la misma lógica en C# – Fredou

+0

Aunque parece que no funciona: ActiveControl es el elemento del menú en el que hice clic :( – Grzenio

Cuestiones relacionadas