在TabControl上禁用默认快捷键

8

Alt text

按下 Ctrl + PageUp/PageDownCtrl + Tab 是TabControl的默认快捷键,它们有助于在相邻的选项卡之间移动。我希望 Ctrl + PageX 只对外部选项卡(tab1、tab2)有效,而当我的焦点在控件(此处为文本框)中时,Ctrl + Tab 只对内部选项卡(tab3、tab4)有效。为此,我需要禁用默认行为。有没有什么方法可以做到这一点?

我查看了ProcessDialogKey和IsInputKey,但它们似乎只能处理单个keydata。修饰符没有被处理。

3个回答

12

TabControl有一些特别的键盘快捷键处理方法,它们都在OnKeyDown()方法中被反映。这样做是为了避免它干扰选项卡页面上控件的键盘操作。

您需要覆盖这个方法。在您的项目中添加一个新的类,并粘贴下面所示的代码。编译后,在工具箱的顶部将新的控件拖到您的Form中。

using System;
using System.Windows.Forms;

class MyTabControl : TabControl {
  protected override void OnKeyDown(KeyEventArgs e) {
    if (e.KeyData == (Keys.Tab | Keys.Control) ||
        e.KeyData == (Keys.PageDown | Keys.Control)) {
      // Don't allow tabbing beyond last page
      if (this.SelectedIndex == this.TabCount - 1) return;
    }
    base.OnKeyDown(e);
  }
}

4
请注意,上述代码并没有禁用所有选项卡控件的热键:您仍然可以使用CTRL+TAB+SHIFT等组合键。请将if语句更改如下:if ( ke.Control && (ke.KeyCode == Keys.Tab || ke.KeyCode == Keys.Next || ke.KeyCode == Keys.Prior)) return; - AZ.
该快捷键可向后制表。 - Hans Passant

4

如Hans Passant的回答所述,除非您在选项卡控件的最后一页上,否则该方法无法工作。我想要一些方法不允许在任何选项卡上使用快捷键。下面的代码还包括了AZ额外的逻辑来处理Ctrl+PageUpCtrl+PageDown。希望这个版本能使整体逻辑更加清晰:

using System.Windows.Forms;

namespace MyNameSpace
{
    internal class NoTabTabControl : TabControl
    {
        /// <summary>
        /// Intercept any key combinations that would change the active tab.
        /// </summary>
        protected override void OnKeyDown(KeyEventArgs e)
        {
            bool changeTabKeyCombination =
                (e.Control
                    && (e.KeyCode == Keys.Tab
                        || e.KeyCode == Keys.Next
                        || e.KeyCode == Keys.Prior));

            if (!changeTabKeyCombination)
            {
                base.OnKeyDown(e);
            }
        }
    }
}

似乎左右箭头键也可以切换标签页。 - JohnSaps

0
只需要在必要时将您的代码中的 tabpageX.Enabled 属性更改为 false。然后使用 Ctrl + Tab 将无法选择 tabpageX
起初,Ctrl + Tab 看上去在我的应用程序中制造了一些混乱。我曾经用它来保存我的资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接