隐藏C#TabControl上的Tab选项卡标题
我正在开发一个Windows窗体应用程序与几个页面。 我正在使用TabControl来实现这一点。 而不是使用标题切换标签之间,我希望我的应用程序来控制,例如,用户填写文本框,然后单击下一个button后,应打开下一个选项卡。
你可以用一个模仿你想要的手工面板代替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; } }
然后添加页面并设置当前可见页面:
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;
为您的项目添加一个新类,并粘贴下面显示的代码。 编译。 将新的控件从工具箱的顶部放到表单上。 它在devise时显示标签,因此您可以在devise时轻松切换它们。 它们在运行时隐藏,使用代码中的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); } }
创build新的UserControl,将其命名为TabControlWithoutHeader,并将inheritance的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); } }
编译后,你将在ToolBox中有TabControlWithoutHeader控件。 把它放在窗体上,在devise器中你会看到标题,但在运行时它们将被隐藏。 如果你想在devise器中隐藏它们,则删除&& !DesignMode
。
希望有所帮助。
tabControl1.Appearance = TabAppearance.FlatButtons; tabControl1.ItemSize = new Size(0, 1); tabControl1.SizeMode = TabSizeMode.Fixed;
我需要这个代码,但在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
并感谢@Hans Passant在C#中的答案
为了补充Hans Passant的现有答案,我发现了四种方法来隐藏用户的箭头,当选项卡的数量超过TablessControl的宽度。 没有一个解决scheme对每个人来说都是完美的,但是对于你来说(或者至less是他们的组合)是不可能的。
解决scheme1:
只需启用Multiline
。 这将防止箭头出现在第一位。 但是,请记住,devise师可能会失去WYSIWYG,因为垂直空间会垂直向下调整,并且TablessControl内的控件甚至可能会在底部被“斩”(尽pipe只是在开发者模式下)。
解决scheme2:
解决上述WYSIWYG问题的更高级的解决scheme是只有在程序运行时才启用Multiline
。 只需将此构造函数添加到TablessControl类:
public TablessControl() { bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime); if (!designMode) Multiline = true; }
对于开发人员来说,他们仍然会显示为一行标签。
解决scheme3:
减小TablessControl的字体大小。 每个标签都应该相应缩小。 由于用户永远不会看到选项卡,如果将字体大小设置为4pt,应该没有什么关系。
但要小心,因为TablessControl的内容也可能resize。 如果发生这种情况,请重新编辑每个窗口小部件的字体大小,在这一点上,即使您决定再次重新更改主TablessControl的字体大小,他们仍然会保持这种大小。
这种方法还具有更好地向开发者展示真正所见即所得的垂直不动产的优势(对于用户来说可以看起来很好,但由于标签的高度而可能在devise者的底部稍微被切断)。
该解决scheme可以与解决scheme1和2相结合,以获得更多的优势。
解决scheme4:
如果任何选项卡的文本很长,则此解决scheme不一定非常好。 感谢汉斯提出的build议。
首先将TablessControl的SizeMode
设置为“Fixed”,然后将TablessControl的ItemSize
Width
属性减小为较小的数字以减less每个制表符的宽度。 也可以随意调整ItemSize
Height
属性以帮助解决上述所见即所得问题,但解决scheme3可能对此问题更有帮助。
该解决scheme可以与上述解决scheme相结合,进一步积累优势。
如果你真的想这样做,你可以做这样的事情
tcActionControls.Region = new Region(new RectangleF( tbPageToShow.Left, tbPageToShow.Top, tbPageToShow.Width, tbPageToShow.Height) );
其中tcActionControls
是您的TabControl
而tbPageToShow
是在此精确时刻显示的TabPage
。
应该为你工作。
问候。
您可以尝试从TabPageCollection中删除TabPage:
TabControl.TabPageCollection tabCol = tabControl1.TabPages;
foreach (TabPage tp in tabCol) { if(condition) { tabCol.Remove(tp); } }