【问题标题】:WinForms TabControl - Add New Tab Button (+)WinForms TabControl - 添加新标签按钮 (+)
【发布时间】:2011-07-18 19:16:50
【问题描述】:

如何在 Windows 窗体应用程序中将 + 按钮添加到 TabControl。这是WPF 的答案。但我想在 WinForms 应用程序中使用它?

【问题讨论】:

    标签: c# winforms button tabs tabcontrol


    【解决方案1】:

    您可以在控件标签的末尾添加一个新标签并将其文本设置为+,然后:

    • 检查用户是否点击了最后一个标签,然后在它之前插入一个新标签。
    • 您应该阻止选择最后一个选项卡。
    • 您应该调整标签的宽度,让最后一个标签的宽度更小。

    然后您将拥有一个如下所示的选项卡控件。为了有更大的选项卡按钮,我在控件上应用了填充。

    Hande 点击最后一个标签

    您可以处理MouseDownMouseClick事件并检查最后一个tab矩形是否包含鼠标点击点,然后在最后一个tab之前插入一个tab:

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

    防止选择最后一个标签

    为了防止选择最后一个标签,可以处理Selecting控制事件,并检查选择的标签是否是最后一个标签,取消该事件:

    private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
    {
        if (e.TabPageIndex == this.tabControl1.TabCount - 1)
            e.Cancel = true;
    }
    

    调整标签宽度

    要调整标签宽度并让最后一个标签具有较小的宽度,您可以处理HandleCreated 事件并向控件发送TCM_SETMINTABWIDTH 并指定标签宽度允许的最小尺寸:

    [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 图标。作为示例,您可以在这篇文章中看到一个实现:TabControl with Close and Add Button

    • 从右到左 (RTL) 支持:您可以在使用自绘标签时添加对 RTL 的支持。这个帖子:Close button for TabPages of Right To Left TabControl 是一个解决方案。

    【讨论】:

      【解决方案2】:

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

      tabcontrol.SelectedTab == newTabPage 
      

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

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

      【讨论】:

      • 这个解决方案有点问题。 “+”标签页眉宽度太大。加号靠左对齐。看起来很糟糕。如何减小标签页眉宽度?
      • 我无法直接找到一个体面的方法来做到这一点,但可能最简单的让它看起来不错的方法是使用类似 (Add Page) 或一些更长的指令填满空间。
      • 要调整标签宽度并让最后一个标签具有更小的宽度,您可以处理HandleCreated 事件并将TCM_SETMINTABWIDTH 发送到控件并指定标签宽度允许的最小尺寸。在这里我分享了一个answer,它可以调整标签的宽度。
      【解决方案3】:

      使用标签“+”创建一个标签,并使用“tabControl1_Selecting”事件,代码如下:

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

      【讨论】:

        【解决方案4】:

        根据@Reza Aghaei 的一些改进

        1. 创建一个新表单并将其命名为 formTab(将表单边框样式设置为无)。
        2. 设置 formTab 的控件(这将是在新选项卡中设置的控件)。
        3. 回到 tabcontrol 并添加一个新标签,将其命名为“+”(确保此标签是 tabcontrol 的结尾)。

        您的表单应该如下所示: form1 formTab

        现在输入这些代码:

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

        希望对你有帮助!

        【讨论】:

          猜你喜欢
          • 2013-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-16
          相关资源
          最近更新 更多