我正在开发一个包含多个页面的Windows窗体应用程序。我正在使用TabControl来实现它。我希望我的应用程序可以控制此选项,而不是使用标题在标签之间切换。在用户填写文本框并单击下一个按钮后,应打开下一个选项卡。
答案 0 :(得分:94)
在项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具箱顶部拖放到表单上。它在设计时显示标签,因此您可以在设计时轻松切换它们。它们在运行时隐藏,使用代码中的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);
}
}
答案 1 :(得分:20)
tabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;
答案 2 :(得分: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);
}
}
编译后,您将在ToolBox中使用TabControlWithoutHeader控件。将其放在表单上,在设计器中您将看到标题,但在运行时它们将被隐藏。如果您也想在设计器中隐藏它们,请删除&& !DesignMode
。
希望有所帮助。
答案 3 :(得分: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;
}
}
然后添加页面并设置当前可见页面:
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;
答案 4 :(得分:9)
我需要这个代码,但是在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#中的答案
答案 5 :(得分:6)
为了补充Hans Passant现有的答案,我发现当标签数量超过TablessControl的宽度时,有四种方法可以隐藏用户的箭头。没有一个解决方案对每个人来说都是完美的,但可能适合你(或者至少是它们的组合)。
只需启用Multiline
即可。这样可以防止箭头出现在第一位。但是,请记住,您可能会在设计器中失去WYSIWYG,因为垂直空间将垂直向下调整,TablessControl中的控件甚至可能会在底部“切断”(同样,仅在开发人员模式下)。
解决上述WYSIWYG问题的更高级解决方案是仅在程序运行后启用Multiline
。只需将此构造函数添加到TablessControl类:
public TablessControl()
{
bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
if (!designMode) Multiline = true;
}
对于开发者来说,它们仍然会显示为一行标签。
减小TablessControl的字体大小。每个标签应相应缩小。由于用户永远不会看到标签,因此如果将字体大小设置为甚至4pt,则无关紧要。
但要小心,因为TablessControl的内容也可能会调整大小。如果发生这种情况,请重新编辑内部每个小部件的字体大小,此时,即使您决定再次重新更改主TablessControl的字体大小,他们也会感谢保持该大小。
这种方法还具有向开发人员更密切地显示真正的所见即所得垂直空间的优势(对于用户而言看起来很好,但由于设备的高度可能会在设计者的底部略微切断)标签)。
该解决方案可与解决方案1和2结合使用,以获得积累的优势。
如果任何标签的文字很长,则此解决方案不一定非常好。感谢Hans提出建议。
首先将TablessControl的SizeMode
设置为'Fixed',然后将TablessControl的ItemSize
Width
属性减少为较小的数字,以减少每个标签的宽度。也可以随意调整ItemSize
Height
属性以帮助解决上述WYSIWYG问题,但解决方案3可能对此问题更有帮助。
该解决方案可与上述解决方案相结合,进一步积累优势。
答案 6 :(得分:4)
如果真的想要这样做,你可以做这样的事情
tcActionControls.Region = new Region(new RectangleF(
tbPageToShow.Left,
tbPageToShow.Top,
tbPageToShow.Width,
tbPageToShow.Height)
);
tcActionControls
TabControl
是tbPageToShow
,TabPage
是{{1}}在这个精确时刻显示的位置。
应该为你工作。
问候。
答案 7 :(得分:1)
您可以尝试从TabPageCollection中删除TabPage:
TabControl.TabPageCollection tabCol = tabControl1.TabPages;
foreach (TabPage tp in tabCol)
{
if(condition)
{
tabCol.Remove(tp);
}
}
答案 8 :(得分:0)
此解决方案似乎效果很好- How to hide tabs in the tab control?
将Tabcontrol插入表单,默认名称为tabcontrol1。
确保在Visual Studio的“属性”窗格中选择了tabcontrol1并更改以下属性:
a。将外观设置为按钮
b。将ItemSize设置为Width,将1设置为Height
c。将多行设置为True
d。将SizeMode设置为Fixed最好在完成设计时任务后完成,因为它也会将它们隐藏在设计器中-使其难以导航!
答案 9 :(得分:0)
在WinForms应用程序中,我可以通过将TabControl的y坐标放置在窗体的可见范围之外来解决此问题,从而有效地隐藏了选项卡。仅当tabControl位于表单顶部附近时,此示例才有效,但是您明白了。
private void frmOptions_Load(object sender, EventArgs e)
{
tabControl1.Top = -23; //Only tabPage contents visible
}