隐藏C#TabControl上的选项卡标题
我正在开发一个有几个页面的Windows窗体应用程序。我正在使用TabControl来实现这一点。我希望我的应用程序能够控制这一点,而不是使用标题在选项卡之间切换。例如,在用户填写文本框并单击“下一步”按钮后,下一个选项卡应该打开。如果您确实想这样做,您可以这样做隐藏C#TabControl上的选项卡标题,c#,winforms,tabcontrol,C#,Winforms,Tabcontrol,我正在开发一个有几个页面的Windows窗体应用程序。我正在使用TabControl来实现这一点。我希望我的应用程序能够控制这一点,而不是使用标题在选项卡之间切换。例如,在用户填写文本框并单击“下一步”按钮后,下一个选项卡应该打开。如果您确实想这样做,您可以这样做 tcActionControls.Region = new Region(new RectangleF( tbPageToShow.Left, tbPageToShow.To
tcActionControls.Region = new Region(new RectangleF(
tbPageToShow.Left,
tbPageToShow.Top,
tbPageToShow.Width,
tbPageToShow.Height)
);
其中tcActionControls
是您的TabControl
,tbPageToShow
是在这个精确时刻显示的TabPage
应该对你有用
注意。创建新的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);
}
}
编译后,工具箱中将有TabControlWithoutHeader控件。把它放到窗体上,在designer中你们会看到标题,但在运行时它们会被隐藏。如果您也想在designer中隐藏它们,请删除&&&!设计模式
希望有帮助
您可以用手工制作的面板代替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;
}
}
向项目中添加一个新类并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖到窗体上。它在设计时显示选项卡,以便您可以在设计时轻松地在它们之间切换。它们在运行时隐藏,请在代码中使用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);
}
}
我需要这个代码,但在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现有的答案,我找到了四种方法,当选项卡数量超过表控件的宽度时,向用户隐藏箭头。没有一个单一的解决方案一定适合每个人,但可能适合你(或至少是它们的组合) 解决方案1: 只需启用多行。这将防止箭头首先出现。但是,请记住,在设计器中可能会丢失所见即所得,因为垂直空间将垂直向下调整,而TablesControl中的控件甚至可能在底部被“截断”(同样,仅在开发人员模式下) 解决方案2: 解决上述WYSIWYG问题的更高级解决方案是在程序运行后只启用
多行
。只需将此构造函数添加到TablesControl类:
public TablessControl()
{
bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
if (!designMode) Multiline = true;
}
对于开发人员来说,它们仍然显示为一行选项卡
解决方案3:
减小表控件的字体大小。每个选项卡都应该相应地缩小。因为用户永远看不到选项卡,所以如果将字体大小设置为4pt也没什么关系
但是要小心,因为TablesControl的内容也可能会调整大小。如果发生这种情况,请重新编辑内部每个小部件的字体大小,此时,即使您决定再次更改主表控件的字体大小,它们也会保持该大小
这种方法还有一个优点,就是可以更紧密地向开发者展示真正的所见即所得垂直房地产(用户可以很满意,但由于标签的高度,可能会在设计师的底部稍微剪掉)
此解决方案可与解决方案1和2结合使用,以积累优势
tabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;
解决方案4:
如果任何选项卡都有很长的文本,这个解决方案就不一定那么好了。谢谢汉斯的建议
首先将TablesControl的SizeMode
设置为“Fixed”,然后将TablesControl的ItemSize
ItemSize
Height
属性,以帮助解决上述所见即所得问题,尽管解决方案3可能对该问题更有帮助
此解决方案可以与上述解决方案结合使用,以进一步积累优势。您可以尝试从TabPageCollection中删除TabPage:
tabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;
TabControl.TabPageCollection tabCol=tabControl1.TabPages
foreach (TabPage tp in tabCol)
{
if(condition)
{
tabCol.Remove(tp);
}
}
该解决方案似乎效果良好-
这最好在您完成设计时任务后完成,因为它也会将它们隐藏在设计器中,从而使导航变得困难 在我的WinForms应用程序中,我可以通过将TabControl的y坐标定位在表单可见范围之外来解决这个问题,因此选项卡被有效隐藏。此示例仅适用于tabControl位于表单顶部附近的情况,但您已经明白了这一点
private void frmOptions_Load(object sender, EventArgs e)
{
tabControl1.Top = -23; //Only tabPage contents visible
}
呃,这不是一种意见。这适用于所有Windows版本。嗨,如果左/右箭头也消失了,你能更新你的代码吗?(否则,当选项卡多于StackPanel框所能容纳的选项卡时,它们会显示)。非常感谢;能够动态切换视图非常方便。请将示例从
类表控件
编辑到公共类表控件
,以便在从其他程序集使用时显示在工具箱中。请在此回答中对代码进行解释!我认为您还希望重写此类中的OnKeyDown方法,以过滤掉Ctrl+Tab事件。如果(ke.KeyCode==Keys.Tab&&ke.Control)…在SO需要属性。@Hans抱歉,我听不懂你的话Hans说他已经发布了这个答案。您刚刚复制了它并再次发布。@volody Hans在MSDN上发布了它(以他的MSDN名称Nobugz)…好吧,我不是一个知道谁是创造者的向导