我在表单上有一个文本框控件。我使用该控件的离开事件来处理用户输入。如果用户单击表单上的其他控件,它可以正常工作,但是当用户直接进入主菜单时,该事件不会触发。有什么办法可以使其每次都触发?
编辑:根据@TcKs的建议,我将事件从ItemClicked更改为MenuActivate。非常感谢您的帮助!
private void menuStrip1_MenuActivate( object sender, EventArgs e )
{
menuStrip1.Focus();
}
private void menuStrip1_MenuActivate( object sender, EventArgs e ) {
bool ret = this.Validate( false );
if ( false == ret ) {
// user's input is wrong
}
}
如果您想在与“this”表单不同的控件中检查验证,可以使用任何ContainerControl。例如,在MDI子窗口中。
有时会出现Lostfocus未触发的情况,例如单击工具栏按钮和菜单项。 我通常使用本地的“LastControl”变量来解决这个问题,并在菜单获得焦点时自己处理它。
菜单点击不失去文本框焦点的原因是有理由的。 如果您想拥有一个包含“粘贴”选项的“编辑”菜单,则“粘贴”应该针对具有焦点的控件进行操作,并且因此不能从表单上的任何控件窃取焦点。
因此,菜单可以被视为不从控件窃取焦点的上下文菜单。
当处理菜单时,你需要模拟一种失去焦点的情况,并且可能要记住它的位置,以防你在不做任何操作的情况下关闭菜单,这样焦点就会返回到文本框中。
你需要一个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