图片框不支持键盘事件吗?
Does a picturebox not support keyboard events?
我目前正在使用 Visual Studio,我不知道这是否是一个小故障,但是当我进入表单属性并显示事件时,有两个事件叫做 KeyDown 和 KeyUp。现在,当我对 PictureBox
执行相同操作时,它的事件更少,并且没有 KeyDown 和 KeyUp 事件。 PictureBox
支持的事件是否少于其他事件?这是故障吗?
Form1
属性的屏幕截图:
PictureBox1 属性的屏幕截图:
PictureBox是用来显示图片的,不需要键盘输入。它不占用焦点,不与键盘交互。
这不是故障。它就是这样。您不输入 PictureBox。
如果您需要通过按键完成某些任务,请仅通过表单进行路由
正如这里其他人所说,在这种情况下捕获键盘事件最合适的方法是在Form
级别拦截按键事件,因为PictureBox
控件无法接收焦点并且缺少公开的关键事件。
为此,首先在设计器中或在表单的构造函数中将表单的 KeyPreview
属性 设置为 true
:
this.KeyPreview = true;
然后,订阅KeyUp
事件:
this.KeyUp += MainForm_KeyUp;
最后,使用类似如下的事件处理器拦截处理关键事件:
private void MainForm_KeyUp(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.A:
// Perform some action...
break;
case Keys.B:
// Perform some action...
break;
case Keys.End:
// Perform some action...
break;
// etc...
}
}
如果您打算从事件处理程序中 "consume" 键,您可以按如下方式设置 KeyEventArgs
对象的 Handled
属性:
e.Handled = true;
您可以使用一个简单的技巧来处理 PictureBox 的键盘事件。
为 MouseEnter 和 MouseLeave 事件添加一个处理程序,以便在光标结束时将焦点设置到 PictureBox。这样做会捕获键盘事件。
...
_myPictureBox.MouseEnter += new EventHandler(myPictureBox_MouseEnter);
_myPictureBox.MouseLeave += new EventHandler(myPictureBox_MouseLeave);
_myPictureBox.KeyDown += new KeyEventHandler(myPictureBox_event_KeyDown);
...
private void myPictureBox_MouseEnter(object sender, EventArgs e)
{
Focus();
}
private void myPictureBox_MouseLeave(object sender, EventArgs e)
{
FindForm().ActiveControl = null;
}
private void myPictureBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
MessageBox.Show("Bye");
}
可以将 KeyDown、KeyPress 和 KeyUp 的事件处理程序添加到 PictureBox。例如,在 Visual Basic 中,对于名为 MyPicBox 的 PictureBox,添加 MyPicBox.MouseEnter 的处理程序并将行 MyPicBox.Select() 放入处理程序中。
图片框现在将响应键盘事件。例如,假设图片框显示科学图像的视觉显示。 PictureBox.KeyDown 处理程序可以拦截像 Shift-Ctrl-H 或 Shift-Ctrl-V 这样的组合键,以调用一些与光标位置相关的操作,例如显示通过底层数组的剪切:
Private Sub MyPicBox_KeyDown(sender As Object, e As KeyEventArgs) Handles MyPicBox.KeyDown
If e.Control AndAlso e.Shift Then
Select Case e.KeyCode
Case Keys.V
MyCut = Cut.VERTICAL
Exit Select
Case Keys.H
MyCut = Cut.HORIZONTAL
Exit Select
Case Keys.N
MyCut = Cut.NONE
Exit Select
End Select
End If
End Sub
键盘事件列在https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.picturebox
我目前正在使用 Visual Studio,我不知道这是否是一个小故障,但是当我进入表单属性并显示事件时,有两个事件叫做 KeyDown 和 KeyUp。现在,当我对 PictureBox
执行相同操作时,它的事件更少,并且没有 KeyDown 和 KeyUp 事件。 PictureBox
支持的事件是否少于其他事件?这是故障吗?
Form1
属性的屏幕截图:
PictureBox1 属性的屏幕截图:
PictureBox是用来显示图片的,不需要键盘输入。它不占用焦点,不与键盘交互。
这不是故障。它就是这样。您不输入 PictureBox。 如果您需要通过按键完成某些任务,请仅通过表单进行路由
正如这里其他人所说,在这种情况下捕获键盘事件最合适的方法是在Form
级别拦截按键事件,因为PictureBox
控件无法接收焦点并且缺少公开的关键事件。
为此,首先在设计器中或在表单的构造函数中将表单的 KeyPreview
属性 设置为 true
:
this.KeyPreview = true;
然后,订阅KeyUp
事件:
this.KeyUp += MainForm_KeyUp;
最后,使用类似如下的事件处理器拦截处理关键事件:
private void MainForm_KeyUp(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.A:
// Perform some action...
break;
case Keys.B:
// Perform some action...
break;
case Keys.End:
// Perform some action...
break;
// etc...
}
}
如果您打算从事件处理程序中 "consume" 键,您可以按如下方式设置 KeyEventArgs
对象的 Handled
属性:
e.Handled = true;
您可以使用一个简单的技巧来处理 PictureBox 的键盘事件。
为 MouseEnter 和 MouseLeave 事件添加一个处理程序,以便在光标结束时将焦点设置到 PictureBox。这样做会捕获键盘事件。
...
_myPictureBox.MouseEnter += new EventHandler(myPictureBox_MouseEnter);
_myPictureBox.MouseLeave += new EventHandler(myPictureBox_MouseLeave);
_myPictureBox.KeyDown += new KeyEventHandler(myPictureBox_event_KeyDown);
...
private void myPictureBox_MouseEnter(object sender, EventArgs e)
{
Focus();
}
private void myPictureBox_MouseLeave(object sender, EventArgs e)
{
FindForm().ActiveControl = null;
}
private void myPictureBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
MessageBox.Show("Bye");
}
可以将 KeyDown、KeyPress 和 KeyUp 的事件处理程序添加到 PictureBox。例如,在 Visual Basic 中,对于名为 MyPicBox 的 PictureBox,添加 MyPicBox.MouseEnter 的处理程序并将行 MyPicBox.Select() 放入处理程序中。 图片框现在将响应键盘事件。例如,假设图片框显示科学图像的视觉显示。 PictureBox.KeyDown 处理程序可以拦截像 Shift-Ctrl-H 或 Shift-Ctrl-V 这样的组合键,以调用一些与光标位置相关的操作,例如显示通过底层数组的剪切:
Private Sub MyPicBox_KeyDown(sender As Object, e As KeyEventArgs) Handles MyPicBox.KeyDown
If e.Control AndAlso e.Shift Then
Select Case e.KeyCode
Case Keys.V
MyCut = Cut.VERTICAL
Exit Select
Case Keys.H
MyCut = Cut.HORIZONTAL
Exit Select
Case Keys.N
MyCut = Cut.NONE
Exit Select
End Select
End If
End Sub
键盘事件列在https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.picturebox