【问题标题】:Disable switching between tabs by click or keys in TabControl通过单击或在 TabControl 中的键禁用选项卡之间的切换
【发布时间】:2016-11-16 10:52:47
【问题描述】:

各位,是否可以通过仅使用 NEXT 按钮切换到另一个选项卡?

这意味着您不能通过单击另一个标签页来切换到另一个标签页。

我通常在 NEXT 按钮上使用的代码是这样的:

tabControl1.SelectedTab = tabPage2;

【问题讨论】:

  • 这是wpf TabControl吗?还是winforms TabControl?
  • 是winforms,你问的我还是不太熟悉,估计是winforms吧。

标签: c# winforms tabcontrol


【解决方案1】:

TabControls Selecting 事件将禁用切换,但我们需要使用bool 值跟踪按钮的click,否则按钮的click 也不会选择选项卡。

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 上的标签页 :))

【讨论】:

  • This looks "clean" when there is no content in the tabs.但是,当我设置 e.Cancel = true 时,NEXT 选项卡会在我取消返回原始选项卡之前“闪烁”。
【解决方案2】:

您可以将ControlStyles.UserMouse 设置为true。这样您就可以简单地禁用标签页眉上的鼠标。

顺便说一句,仅仅禁用点击标题是不够的,您需要禁用让用户在选项卡之间切换的键,例如 Shift+TabCtrl+Shift+Tab, , , 首页 和 结束

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);
    }
}

注意:如果你喜欢有一个类似向导的控件(没有标题的选项卡控件),你可以像this一样处理TCM_ADJUSTRECT。您也应该在该解决方案中禁用这些键。这是一个修改后的版本:

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);
    }
}

【讨论】:

  • 我应该把你的代码放在哪里?特别是在 => public class MyTabControl : TabControl 上。我应该创建一个名为“MyTabControl”的新类并从 TabControl 继承它吗?
  • 是的,这是一个新课程。复制代码并将其粘贴到项目的新文件中就足够了,在构建项目后,控件将被添加到工具箱中。然后,您可以在表单上放置一个控件实例。
  • 您可以在运行时看到第一个 MyTabControl 和第二个 WizardControl 之间的区别。在设计时,它们都像标准的TabControl,但在运行时,WizardControl 不显示选项卡标题。它就像一个多面板,让您在设计时使用所有选项卡页面,但在运行时您可以使用代码在选项卡之间切换,就像向导所期望的那样。 MyTabControl 在朗姆酒时间就像一个普通的TabControl 带有标题,但要在选项卡之间切换,您应该使用代码(例如按钮的单击事件来设置选定的选项卡)。
【解决方案3】:

试试这个

tabControl1.SelectTab(tabPage2);

在索引上

tabControl1.SelectTab(1); 

Tablist 是基于 0 的索引,因此“1”是第二个选项卡。

【讨论】:

    【解决方案4】:

    其中一个选项是尝试简单的IsHitTestVisible="False"

    【讨论】:

    • 需要更多细节。 TabControl 和 TabPage 没有“IsHitTestVisible”属性
    猜你喜欢
    • 2016-03-13
    • 1970-01-01
    • 2018-07-31
    • 2015-08-27
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多