C# WinForms TabControl-添加新选项卡按钮(+;)

C# WinForms TabControl-添加新选项卡按钮(+;),c#,winforms,button,tabs,tabcontrol,C#,Winforms,Button,Tabs,Tabcontrol,如何在Windows窗体应用程序中向选项卡控件添加+按钮。这里有一个答案。但是我想在WinForms应用程序中使用它?创建一个带有标记“+”的选项卡,并使用“tabControl1\u Selecting”事件,代码如下: if(e.TabPageIndex==tabControl1.TabPages.Count-1) tabControl1.TabPages.Insert(tabControl1.TabPages.Count - 1,"tab"+e.TabPageIndex); 我会

如何在Windows窗体应用程序中向
选项卡控件添加
+
按钮。这里有一个答案。但是我想在WinForms应用程序中使用它?

创建一个带有标记“+”的选项卡,并使用“tabControl1\u Selecting”事件,代码如下:

if(e.TabPageIndex==tabControl1.TabPages.Count-1)
    tabControl1.TabPages.Insert(tabControl1.TabPages.Count - 1,"tab"+e.TabPageIndex);

我会添加一个新的TabPage,然后将标题设置为“+”,将其名称设置为newTabPage,并为TabControl的SelectedIndexChanged添加一个事件。那你只要检查一下

tabcontrol.SelectedTab == newTabPage 
如果是这种情况,您可以创建一个新的TabPage,将其插入tabControl并将其设置为SelectedTab,如下所示:

tabControl.TabPages.Insert(tabControl.TabPages.Count - 1, createdTabPage);
tabControl.SelectedTab = createdTabPage;

您可以将新选项卡添加到控件选项卡的末尾,并将其文本设置为
+
,然后:

  • 检查用户是否单击了最后一个选项卡,然后在其前面插入一个新选项卡
  • 应防止选择最后一个选项卡
  • 您应该调整选项卡的宽度,并使最后一个选项卡的宽度更小
然后您将有一个如下所示的选项卡控件。为了有更大的选项卡按钮,我对控件应用了填充

点击最后一个选项卡

您可以处理
MouseDown
MouseClick
事件,检查最后一个选项卡矩形是否包含鼠标单击点,然后在最后一个选项卡之前插入一个选项卡:

private void tabControl1_MouseDown(object sender, MouseEventArgs e)
{
    var lastIndex = this.tabControl1.TabCount - 1;
    if (this.tabControl1.GetTabRect(lastIndex).Contains(e.Location))
    {
        this.tabControl1.TabPages.Insert(lastIndex, "New Tab");
        this.tabControl1.SelectedIndex = lastIndex;
    }
}
防止选择最后一个选项卡

要防止选择最后一个选项卡,您可以处理
选择
控制事件,并检查选择选项卡是否为最后一个选项卡,取消事件:

private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
    if (e.TabPageIndex == this.tabControl1.TabCount - 1)
        e.Cancel = true;
}
调整选项卡的宽度


要调整制表符宽度并使最后一个制表符具有较小的宽度,您可以将hanlde
HandleCreated
事件发送到控件并指定制表符宽度允许的最小大小:

[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
private const int TCM_SETMINTABWIDTH = 0x1300 + 49;
private void tabControl1_HandleCreated(object sender, EventArgs e)
{
    SendMessage(this.tabControl1.Handle, TCM_SETMINTABWIDTH, IntPtr.Zero, (IntPtr)16);
}
注意

  • 您可以简单地将逻辑封装在派生的
    TabContol
    中,并创建一个支持添加选项卡的自定义选项卡控件

  • 关闭按钮:您也可以简单地让控件所有者绘制和处理选项卡的绘制,以在选项卡上显示
    +
    图标和
    X
    图标。例如,您可以在本文中看到一个实现:

  • 从右向左(RTL)支持:您可以在使用所有者绘图选项卡时添加对RTL的支持。这篇文章:是一个解决方案


根据@Reza Aghaei进行的一些改进

  • 创建一个新表单并将其命名为formTab(将表单boarder样式设置为none)
  • 设置formTab的控件(这将是在新选项卡中设置的控件)
  • 返回tabcontrol并添加一个新选项卡,将其命名为“+”(确保此选项卡是tabcontrol的结尾
  • 您的表单应该如下所示:

    现在输入以下代码:

    private void Form1_Load(object sender, EventArgs e)
        {
            TabPage tab = tabControl1.TabPages[0];
            var newTab = new formTab();
            newTab.TopLevel = false;
            newTab.Dock = DockStyle.Fill;
            newTab.Show();
            newTab.Visible = true;
            tab.Controls.Add(newTab);
        }
    
    
    private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
        {
            var tabAdd = tabControl1.TabCount - 1;
    
            if (tabControl1.SelectedIndex == tabAdd)
            {
                //create a new tabpage
                var t = new TabPage();
    
                //create a new formTab with webControl in it
                var newTab = new formTab();
    
                //show the new formTab
                newTab.Show();
                newTab.TopLevel = false;
                newTab.Dock = DockStyle.Fill;
                newTab.Visible = true;
    
                //add formTab as new control in the tabpage just created
                t.Controls.Add(newTab);
    
                //insert the new created tab into tab control and before tabLoc
                tabControl1.TabPages.Insert(tabAdd, t);
    
                //select the new created tab
                var newCreatedTab = tabControl1.TabCount - 2;
                tabControl1.SelectedIndex = newCreatedTab;
            }
        }
    

    希望有帮助

    此解决方案有一个小问题。“+”制表符标题宽度太大。加号由左侧对齐。看起来很糟糕。如何减少选项卡标题宽度?我无法直接找到一个合适的方法,但最简单的方法可能是使用(添加页面)或一些较长的指令,以填充空间。要调整选项卡宽度并使最后一个选项卡具有较小的宽度,您可以删除HandleCreated
    事件,并向控件发送
    TCM\u SETMINTABWIDTH
    ,并指定选项卡宽度允许的最小大小。在这里,我共享了一个调整选项卡宽度的工具。