所以我在处理情况时遇到了一些问题。我有一个应用程序,它是一个MDI应用程序,它打开自定义文档。我的MDI父级有一个ToolStrip,带有一些控件,一个文本框和一个按钮。文本框包含项目的数量值,然后有一个按钮将项目添加到文档中。最快操作的模型是,从数量文本框开始,输入数量,选项卡到零件编号文本框并输入零件号,然后选项卡到添加按钮并按Enter键或空格键。这比使用鼠标单击按钮或单击进入文本框要快。所以我希望我的应用程序在按钮被触发后自动聚焦数量文本框。
我已经处理了ToolStripMenuItem.Click事件,该事件添加了该项目,然后重新复制了数量框,当鼠标用于单击按钮时,它可以正常工作。但由于某种原因,我还没有发现,这在键盘触发按钮时不起作用。我知道点击事件正在被触发,因为项目被正确添加,但焦点未正确处理。事实上,在这种情况下,似乎焦点完全丢失,标签停止运行,除了鼠标之外无法重新获得焦点。我尝试了以下内容:
调用Form.Activate()i父表单,并处理Activated事件以聚焦文本框。
在父表单上调用Focus(),并处理GotFocus事件以聚焦文本框。
就好像底层框架无法正确处理关键事件,并且没有为ToolStripMenuItemButton控件公开Key事件。我有点不知所措。该应用程序功能正常,因为鼠标可以工作,实际上可以使用该应用程序,但为了获得最佳功能,我需要使其正常工作,以便无需使用鼠标即可快速输入数据。
答案 0 :(得分:3)
你是对的,这是一种奇怪的行为。我能够像这样克服它:
public partial class Form1 : Form
{
bool myButtonJustClicked = false;
public Form1()
{
InitializeComponent();
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
myButtonJustClicked = true;
toolStripTextBox1.Focus();
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if(myButtonJustClicked)
{
toolStripTextBox1.Focus();
myButtonJustClicked = false;
}
}
}
基本上,我正在使用表单的“KeyUp”事件来处理应该在按钮上触发的KeyUp事件,但没有“KeyUp”事件或任何与键盘相关的事件,由于某种原因在ToolStripButtons。
为了确保当其他KeyUp事件在表单中的其他地方触发时文本框没有获得焦点,我使用myButtonJustClicked布尔值,如图所示。
此外,当然,我在toolStripTextBox1.Focus();
方法中留下toolStripButton1_Click
来处理鼠标点击。