在C#TabControl上隐藏选项卡标题

Hos*_*her 47 c# tabcontrol winforms

我正在开发一个包含多个页面的Windows窗体应用程序.我正在使用TabControl来实现它.我希望我的应用程序控制它,而不是使用标题在标签之间切换,例如,在用户填写文本框并单击下一个按钮后,应打开下一个标签.

Han*_*ant 96

在项目中添加一个新类并粘贴下面显示的代码.编译.将新控件从工具箱顶部拖放到表单上.它在设计时显示标签,因此您可以在设计时轻松切换它们.它们在运行时隐藏,使用代码中的SelectedTab或SelectedIndex属性来切换页面.

using System;
using System.Windows.Forms;

public class TablessControl : TabControl {
  protected override void WndProc(ref Message m) {
    // Hide tabs by trapping the TCM_ADJUSTRECT message
    if (m.Msg == 0x1328 && !DesignMode) m.Result = (IntPtr)1;
    else base.WndProc(ref m);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 呃,这不是一个意见.这适用于所有Windows版本. (22认同)
  • 嗨,你可以在左/右箭头消失的情况下更新你的代码吗?(当StackPanel框中包含的选项卡多于其他选项卡时,它们会显示).非常感谢; 能够动态切换这样的视图是非常方便的. (3认同)
  • 如果能对此答案中的代码进行解释,我们将不胜感激! (2认同)
  • 我认为您还想覆盖此类中的 OnKeyDown 方法以过滤掉 Ctrl+Tab 事件。if (ke.KeyCode == Keys.Tab && ke.Control)... (2认同)

Geo*_*aph 23

tabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;
Run Code Online (Sandbox Code Playgroud)

  • 此外,您可能想要使用,`tabControl1.TabStop = False;` (2认同)

Ren*_*iuz 16

创建新的UserControl,将其命名为TabControlWithoutHeader,并将继承的UserControl更改为TabControl并添加一些代码.结果代码应如下所示:

public partial class TabControlWithoutHeader: TabControl
{
    public TabControlWithoutHeader()
    {
        InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {
    if (m.Msg == 0x1328 && !DesignMode)
        m.Result = (IntPtr)1;
    else
        base.WndProc(ref m);
    }
}
Run Code Online (Sandbox Code Playgroud)

编译后,你将在ToolBox中有TabControlWithoutHeader控件.将其放在表单上,​​在设计器中您将看到标题,但在运行时它们将被隐藏.如果你想在设计师中隐藏它们,那么删除&& !DesignMode.

希望有所帮助.

http://social.msdn.microsoft.com/Forums/windows/en-US/c290832f-3b84-4200-aa4a-7a5dc4b8b5bb/tabs-in-winform?forum=winforms

  • @Hans抱歉,我不明白你写的是什么 (2认同)
  • 你可能错了Cody Gray,只是检查时间 (2认同)

小智 14

您可以使用模仿您想要的手工制作的面板替换tabcontrol:

class MultiPagePanel : Panel
{
  private int _currentPageIndex;
  public int CurrentPageIndex
  {
    get { return _currentPageIndex; }
    set
    {
      if (value >= 0 && value < Controls.Count)
      {
        Controls[value].BringToFront();
        _currentPageIndex = value;
      }
    }
  }

  public void AddPage(Control page)
  {
    Controls.Add(page);
    page.Dock = DockStyle.Fill;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后添加页面并设置当前可见页面:

MultiPagePanel p;

// MyTabPage is a Control derived class that represents one page on your form.
MyTabPage page = new MyTabPage(); 
p.AddPage(page);

p.CurrentPageIndex = 0;
Run Code Online (Sandbox Code Playgroud)

  • 只是偶然发现了这个线程并发现了一个错误:if(value> = 0 && value <(Controls.Count - 1))应该是if(value> = 0 && value <Controls.Count).否则你会错过一些面板. (2认同)

abo*_*oni 10

我需要这个代码,但在VB.net中,所以我转换它.如果有人在VB.Net中需要这个代码那就是

Imports System
Imports System.Windows.Forms

Public Class TablessControl
           Inherits System.Windows.Forms.TabControl

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        ' Hide tabs by trapping the TCM_ADJUSTRECT message
        If (m.Msg = Convert.ToInt32("0x1328", 16) And Not DesignMode) Then
            m.Result = CType(1, IntPtr)
        Else
            MyBase.WndProc(m)
        End If
    End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

并感谢@Hans Passant在C#中的答案


Dan*_*n W 6

为了补充Hans Passant现有的答案,当Tab的数量超过TablessControl的宽度时,我发现了四种隐藏用户箭头的方法.没有一种解决方案对每个人来说都是完美的,但可能适合你(或者至少是它们的组合).

解决方案1:

简单地启用Multiline.这样可以防止箭头出现在第一位.但是,请记住,您可能会在设计器中失去WYSIWYG,因为垂直空间将垂直向下调整,而TablessControl中的控件甚至可能会在底部"切断"(同样,仅在开发人员模式下).

解决方案2:

解决上述WYSIWYG问题的更高级解决方案是仅Multiline在程序运行后启用.只需将此构造函数添加到TablessControl类:

public TablessControl()
{
    bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
    if (!designMode) Multiline = true;      
}
Run Code Online (Sandbox Code Playgroud)

对于开发人员来说,它们仍然会显示为一行标签.

解决方案3:

减小TablessControl的字体大小.每个标签应相应缩小.由于用户永远不会看到标签,因此如果将字体大小设置为甚至4pt,则无关紧要.

但要小心,因为TablessControl的内容也可能会调整大小.如果发生这种情况,请重新编辑内部每个小部件的字体大小,此时,即使您决定再次重新更改主TablessControl的字体大小,他们也会感激地保持该大小.

这种方法还具有向开发人员更密切地显示真正的WYSIWYG垂直空间的优点(对于用户来说看起来很好,但由于标签的高度,可能会在设计者的底部略微切断).

该解决方案可以与解决方案1和2组合以获得累积的优势.

解决方案4:

如果任何标签具有很长的文本,则该解决方案不一定非常好.感谢Hans提出建议.

首先将TablessControl设置SizeMode为"Fixed",然后将TablessControl的ItemSize Width属性减少为较小的数字以减小每个选项卡的宽度.也可以随意调整ItemSize Height属性以帮助解决上述WYSIWYG问题,尽管解决方案3可能对此问题更有帮助.

该解决方案可以与上述解决方案组合以进一步积累优势.


Tig*_*ran 5

如果你真的想这样做,你可以做这样的事情

 tcActionControls.Region = new Region(new RectangleF(
             tbPageToShow.Left, 
               tbPageToShow.Top, 
                 tbPageToShow.Width, 
                    tbPageToShow.Height)
);
Run Code Online (Sandbox Code Playgroud)

哪里tcActionControls是你的TabControl,并tbPageToShowTabPage在这个精确时刻显示。

应该为你工作。

问候。