通过单击或 TabControl 中的键禁用选项卡之间的切换
Disable switching between tabs by click or keys in TabControl
伙计们,是否可以仅使用 NEXT 按钮切换到另一个选项卡?
这意味着您不能通过单击另一个标签页来切换到另一个标签页。
我通常在 NEXT 按钮上使用的代码是这样的:
tabControl1.SelectedTab = tabPage2;
试一试这个
tabControl1.SelectTab(tabPage2);
在索引上
tabControl1.SelectTab(1);
Tablist 是基于 0 的索引,因此“1”是第二个标签。
TabControls Selecting
事件将禁用切换,但我们需要使用 bool
值跟踪按钮的 click
,否则按钮的 click
不会 select 选项卡。
bool checkCancel = true;
private void button2_Click(object sender, EventArgs e)
{
checkCancel = false;
tabControl1.SelectTab("tabPage2");
}
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = checkCancel;
checkCancel = true;
}
结果,(顺便说一下,尝试点击 gif 中的标签页 :))
您可以将 ControlStyles.UserMouse
设置为 true。这样你就可以简单地禁用选项卡 headers.
上的鼠标
顺便说一句,仅禁用点击 headers 是不够的,您需要禁用让用户在选项卡之间切换的键,例如 Shift +Tab, Ctrl+Shift+Tab, ←, →, Home and End.
using System.Linq;
using System.Windows.Forms;
using System.ComponentModel;
public class MyTabControl : TabControl
{
public MyTabControl()
{
if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
SetStyle(ControlStyles.UserMouse, true);
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
var filteredKeys = new Keys[]{(Keys.Control | Keys.Tab),
(Keys.Control | Keys.Shift | Keys.Tab),
Keys.Left, Keys.Right, Keys.Home, Keys.End};
if (filteredKeys.Contains(keyData))
return true;
return base.ProcessCmdKey(ref msg, keyData);
}
}
注意:如果你喜欢wizard-like控件(没有header的选项卡控件),你可以处理TCM_ADJUSTRECT
像this。您也应该在该解决方案中禁用这些键。这是更改后的版本:
using System.Linq;
using System.Windows.Forms;
using System.ComponentModel;
public class WizardControl: TabControl
{
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
var filteredKeys = new Keys[]{(Keys.Control | Keys.Tab),
(Keys.Control | Keys.Shift | Keys.Tab),
Keys.Left, Keys.Right, Keys.Home, Keys.End};
if (filteredKeys.Contains(keyData))
return true;
return base.ProcessCmdKey(ref msg, keyData);
}
public const int TCM_FIRST = 0x1300;
public const int TCM_ADJUSTRECT = (TCM_FIRST + 40);
protected override void WndProc(ref Message m)
{
if (m.Msg == TCM_ADJUSTRECT && !DesignMode)
m.Result = (IntPtr)1;
else
base.WndProc(ref m);
}
}
其中一种选择是尝试简单 IsHitTestVisible="False"
伙计们,是否可以仅使用 NEXT 按钮切换到另一个选项卡?
这意味着您不能通过单击另一个标签页来切换到另一个标签页。
我通常在 NEXT 按钮上使用的代码是这样的:
tabControl1.SelectedTab = tabPage2;
试一试这个
tabControl1.SelectTab(tabPage2);
在索引上
tabControl1.SelectTab(1);
Tablist 是基于 0 的索引,因此“1”是第二个标签。
TabControls Selecting
事件将禁用切换,但我们需要使用 bool
值跟踪按钮的 click
,否则按钮的 click
不会 select 选项卡。
bool checkCancel = true;
private void button2_Click(object sender, EventArgs e)
{
checkCancel = false;
tabControl1.SelectTab("tabPage2");
}
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = checkCancel;
checkCancel = true;
}
结果,(顺便说一下,尝试点击 gif 中的标签页 :))
您可以将 ControlStyles.UserMouse
设置为 true。这样你就可以简单地禁用选项卡 headers.
顺便说一句,仅禁用点击 headers 是不够的,您需要禁用让用户在选项卡之间切换的键,例如 Shift +Tab, Ctrl+Shift+Tab, ←, →, Home and End.
using System.Linq;
using System.Windows.Forms;
using System.ComponentModel;
public class MyTabControl : TabControl
{
public MyTabControl()
{
if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
SetStyle(ControlStyles.UserMouse, true);
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
var filteredKeys = new Keys[]{(Keys.Control | Keys.Tab),
(Keys.Control | Keys.Shift | Keys.Tab),
Keys.Left, Keys.Right, Keys.Home, Keys.End};
if (filteredKeys.Contains(keyData))
return true;
return base.ProcessCmdKey(ref msg, keyData);
}
}
注意:如果你喜欢wizard-like控件(没有header的选项卡控件),你可以处理TCM_ADJUSTRECT
像this。您也应该在该解决方案中禁用这些键。这是更改后的版本:
using System.Linq;
using System.Windows.Forms;
using System.ComponentModel;
public class WizardControl: TabControl
{
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
var filteredKeys = new Keys[]{(Keys.Control | Keys.Tab),
(Keys.Control | Keys.Shift | Keys.Tab),
Keys.Left, Keys.Right, Keys.Home, Keys.End};
if (filteredKeys.Contains(keyData))
return true;
return base.ProcessCmdKey(ref msg, keyData);
}
public const int TCM_FIRST = 0x1300;
public const int TCM_ADJUSTRECT = (TCM_FIRST + 40);
protected override void WndProc(ref Message m)
{
if (m.Msg == TCM_ADJUSTRECT && !DesignMode)
m.Result = (IntPtr)1;
else
base.WndProc(ref m);
}
}
其中一种选择是尝试简单 IsHitTestVisible="False"