2010-12-15 134 views
5

有没有简单的方法来设置Visual Studio 2010中的选项卡控件中的选项卡的键盘快捷键?有一些我可以设置的属性吗?如何设置Windows窗体TabControl的键盘快捷键?

我在网上看,但我看到的所有文章都很混乱。

+1

Windows Forms应用程序? ASP.NET? WPF?第三方控件库? – 2010-12-15 17:38:19

+0

Windows窗体应用程序在后面的代码中使用VB。 – chama 2010-12-15 17:44:26

+1

为什么这不封闭?你还需要别的吗? – 2010-12-24 07:34:33

回答

5

不幸的是,没有任何这样的属性,但实现这个功能并不一定很难。有两种方法值得考虑,这取决于应用程序的设计。

  1. 如果承载TabControl的表单已经使用菜单系统,则设置几乎是微不足道的。首先,您需要添加一个菜单命令,切换到您的TabControl中的每个TabPage。然后,您可以简单地向该菜单项添加键盘快捷键(其中简单属性MenuItem/ToolStripMenuItem),以便无论何时按下该键,该菜单命令都会执行,并切换到相应的TabPage

  2. 但是,菜单系统可能不适合每种形式。如果是这样的话,你将不得不做更多的工作。基本上,您需要将承载您的TabControl的表单的KeyPreview属性设置为True,并检测要用来切换制表符的键盘快捷键。

    设置表单的KeyPreview property允许该表单在这些事件传递到具有焦点的控件之前接收关键事件。这对于此方法起作用至关重要,否则,表单的KeyDown事件处理程序中的代码将永远不会检测到要捕获的击键。只有表单处理完成后,每个按键才会被传递到通常会收到的控件上。

    因此,一旦您设置了此属性,您需要将代码添加到表单的KeyDown event的处理程序中,以监视您要使用的任何键盘快捷键,然后在检测到其中一个键时切换标签被按下。否则,你不必做任何事情。

    举例来说,如果你有三个TabPages表单上,你可能会认为F2将切换到第一个选项卡,F3将切换到第二个,F4将切换到第三(尽管,显然,你可以使用任何你想要的键)。然后,您可以添加以下代码到表单的KeyDown事件处理程序,检测被按下这些键和采取相应的行动:

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 
        Select Case e.KeyCode 
         Case Keys.F2 
          'Switch to the first tab page 
          MyTabControl.SelectedIndex = 0 
         Case Keys.F3 
          'Switch to the second tab page 
          MyTabControl.SelectedIndex = 1 
         Case Keys.F4 
          'Switch to the third tab page 
          MyTabControl.SelectedIndex = 2 
        End Select 
    End Sub 
    
0

您可以覆盖一个控件的ProcessCmdKey()方法来实现自定义的快捷键。这样做的一个巨大优势在于,只有在选项卡页面上的选项卡控件或其中一个控件具有焦点时,按键才会起作用。 Project +添加类,粘贴下面显示的代码并编译。将新的控件从工具箱的顶部拖放到表单上。

Public Class MyTabControl 
    Inherits TabControl 

    Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean 
     If keyData >= Keys.F1 And keyData <= Keys.F10 Then 
      Me.SelectedIndex = keyData - Keys.F1 
      Return True 
     End If 
     Return MyBase.ProcessCmdKey(msg, keyData) 
    End Function 

End Class 

如果您希望无论窗体上的哪个控件具有焦点,都要使用这些功能键,那么您应该重写窗体的ProcessCmdKey方法。