【发布时间】:2019-01-11 13:04:55
【问题描述】:
我正在测试为按钮创建快捷方式的方法。我发现的一种方法是在按钮的文本属性之前添加一个与号 (&),以便当用户使用按钮的第一个字母按下 ALT 键时,它应该触发该按钮的按钮单击事件。问题是,即使用户只按下相应的字母,而没有按下 ALT 键,按钮单击事件也会被触发。
【问题讨论】:
我正在测试为按钮创建快捷方式的方法。我发现的一种方法是在按钮的文本属性之前添加一个与号 (&),以便当用户使用按钮的第一个字母按下 ALT 键时,它应该触发该按钮的按钮单击事件。问题是,即使用户只按下相应的字母,而没有按下 ALT 键,按钮单击事件也会被触发。
【问题讨论】:
您可以尝试为您的控件放置一个单独的 KeyDown 事件。下面的示例实现了 ToolStripMenu、DatagridView 的快速快捷方式。
Private Sub Shortcuts_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles _
ToolStrip1.KeyDown, dgvToolStrip.KeyDown, dgvDataTable.KeyDown
If (e.KeyCode And Not Keys.Modifiers) = Keys.F5 Then
btnRefresh.PerformClick()
ElseIf e.KeyValue = Keys.Enter Then
btnOK.PerformClick()
ElseIf e.KeyValue = Keys.F10 Then 'AndAlso e.Modifiers = Keys.Shift Then
btnShowAll.PerformClick()
ElseIf (e.KeyCode And Not Keys.Modifiers) = Keys.P AndAlso e.Modifiers = Keys.Alt Then
btnShowImage.PerformClick()
End If
End Sub
【讨论】:
同Accelerator (mnemonic key) are executed without pressing ALT key
这发生在没有编辑功能的控件中,例如按钮、单选按钮、复选框等。您可以通过创建自定义按钮来抑制此行为,覆盖 ProcessMnemonic 方法并在未按下 alt 键时返回 false。
public class CustomButton : Button
{
protected override bool ProcessMnemonic(char charCode)
{
if ((Control.ModifierKeys & Keys.Alt) == Keys.None)
return false;
return base.ProcessMnemonic(charCode);
}
}
【讨论】: