有人想过吗?
答案 0 :(得分:4)
您需要从TabControl派生并重写ProcessCmdKey,虚方法以覆盖Ctrl-Tab行为。
示例:
public class ExtendedTabControl: TabControl
{
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.Tab))
{
// Write custom logic here
return true;
}
if (keyData == (Keys.Control | Keys.Shift | Keys.Tab))
{
// Write custom logic here, for backward switching
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
答案 1 :(得分:2)
TabControl处理Tab键的处理相当不寻常。它会覆盖ProcessKeyPreview()方法以检测Ctrl / Shift / Tab,然后在其OnKeyDown()方法中实现选项卡选择。它这样做是因为它可以在它具有焦点本身以及任何子控件时检测击键。并避免通过其中一个子控件踩踏自定义Tab键处理。您可以通过重写ProcessCmdKey()使其工作,但是您将破坏想要响应选项卡的子控件。
最好的办法是覆盖它的OnKeyDown()方法。在项目中添加一个新类并粘贴下面显示的代码。编译。将新选项卡控件从工具箱顶部拖放到表单上。
using System;
using System.Windows.Forms;
class MyTabControl : TabControl {
protected override void OnKeyDown(KeyEventArgs e) {
if (e.KeyCode == Keys.Tab && (e.KeyData & Keys.Control) != Keys.None) {
bool forward = (e.KeyData & Keys.Shift) == Keys.None;
// Do your stuff
//...
}
else base.OnKeyDown(e);
}
}
请注意,您还应该考虑Ctrl + PageUp和Ctrl + PageDown。