我正在使用WinForms。我已经为主窗体的KeyDown
事件创建了一个事件处理程序,从而调用了一个按钮的Click
事件处理程序。
调用的Click
事件处理程序取决于按下的特定键。如果用户单击该按钮而不是使用该键,然后随后尝试使用该键,则该键(例如向下箭头)用作制表符循环,在表单上的每个按钮控件之间更改焦点(而不是执行Keydown处理程序)。
有什么想法吗?
答案 0 :(得分:2)
问题是,按钮在单击时具有焦点,因此后续按键不会被表单本身捕获,而是由按钮捕获。在按钮的单击事件处理程序中,将焦点放在以下表单:
this.Focus();
这样,焦点就会恢复到表单中,因此表单会监听按键事件。
修改强>
正如您所发现的那样,真正的问题是箭头键不会被视为输入键。要解决此问题,您需要创建一个继承您要使用的控件的新类。然后,您覆盖IsInputKey
方法以将箭头键视为输入键。请检查此链接:http://bytes.com/topic/c-sharp/answers/517530-trapping-arrow-keys-usercontrol。本文也很有用:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.isinputkey.aspx。
答案 1 :(得分:2)
根据SimpleCoder,我必须覆盖Button类的IsInputKey
成员。
public class ControlButton : Button
{
protected override bool IsInputKey(Keys keyData)
{
if (keyData == Keys.Up)
{
return true;
}
else if (keyData == Keys.Down)
{
return true;
}
else if (keyData == Keys.Left)
{
return true;
}
else if (keyData == Keys.Right)
{
return true;
}
else
{
return base.IsInputKey(keyData);
}
}
}
然后我需要使用这个新类来实例化我的按钮对象(在设计器类中),如下所示:
private ControlButton btnDown;
private ControlButton btnRight;
private ControlButton btnLeft;
private ControlButton btnUp;
this.btnDown = new ControlButton();
this.btnRight = new ControlButton();
this.btnUp = new ControlButton();
this.btnLeft = new ControlButton();
接下来,我为每个新按钮对象注册了OnClick
个处理程序,如下所示:
this.btnUp.Click += new System.EventHandler(this.btnUp_Click);
private void btnUp_Click(object sender, EventArgs e)
{
MessageBox.Show("Up");
}
(等)
并为主要表单注册了KeyDown
处理程序:
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.frmUavController_KeyDown);
private void frmUavController_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == Keys.Up) || (e.KeyCode == Keys.W))
{
btnUp.PerformClick();
}
else if ((e.KeyCode == Keys.Down) || (e.KeyCode == Keys.S))
{
btnDown.PerformClick();
}
else if ((e.KeyCode == Keys.Left) || (e.KeyCode == Keys.A))
{
btnLeft.PerformClick();
}
else if ((e.KeyCode == Keys.Right) || (e.KeyCode == Keys.D))
{
btnRight.PerformClick();
}
}
将主窗体属性KeyPreview
设置为true,并且看到我已经覆盖了向上,向下,向左和向右键的默认行为,按钮控制不再循环焦点,而是返回true ,将控制权转回主表格。从这里开始,如果按下后续键(向上,向下,向左或向右),表单将操作相应的处理程序。
答案 2 :(得分:0)
使用Control.GetNextControl并将焦点设置为它返回的内容。
答案 3 :(得分:0)
查看KeyPreview属性。 http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx
将其设为true
。
或者您可能希望覆盖表单的ProcessKeyPreview
。