我正在开发一个包含多个页面的 Windows Form 应用程序。我使用 TabControl 来实现这一点。但是,我希望我的应用程序来控制选项卡之间的切换,例如在用户填写文本框并单击下一步按钮后,下一个选项卡应该打开。
我正在开发一个包含多个页面的 Windows Form 应用程序。我使用 TabControl 来实现这一点。但是,我希望我的应用程序来控制选项卡之间的切换,例如在用户填写文本框并单击下一步按钮后,下一个选项卡应该打开。
在您的项目中添加一个新类,并粘贴下面显示的代码。编译。从工具箱的顶部将新控件拖放到表单上。它在设计时显示选项卡,因此您可以在设计时轻松地在它们之间切换。它们在运行时被隐藏,使用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);
}
}
class TablessControl
编辑为 public class TablessControl
,以便在使用不同程序集时在工具箱中显示它。 - NebulatabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;
tabControl1.TabStop = False;
。 - krowe2创建新的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控件。将其拖放到表单上,在设计器中您将看到页签标题,但在运行时它们将被隐藏。如果您想在设计器中也隐藏它们,则删除&& !DesignMode
。希望能帮到您。
参考链接:http://social.msdn.microsoft.com/Forums/windows/en-US/c290832f-3b84-4200-aa4a-7a5dc4b8b5bb/tabs-in-winform?forum=winforms您可以使用手工制作的面板来替换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;
我需要这段代码,但是它是用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# 中提供的答案。
public TablessControl()
{
bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
if (!designMode) Multiline = true;
}
对于开发人员来说,它们仍将显示为单行选项卡。
减小TablessControl的字体大小。每个选项卡应相应缩小。由于用户永远不会看到选项卡,因此将字体大小设置为甚至为4pt应该不会有太大影响。
但是要注意,TablessControl的内容也可能被调整大小。如果出现这种情况,请重新编辑每个部件内的字体大小,然后,即使您随后再次决定重新更改主TablessControl的字体大小,它们也将幸运地保持在那个大小。
这种方法还具有更接近真正WYSIWYG垂直可用空间的优点,这样即使在设计师中由于选项卡的高度而在底部略微被削减,对于用户看起来也很好。
此解决方案可以与解决方案1和2结合使用以累积优势。
如果任何选项卡的文本都很长,则此解决方案并不一定那么好。感谢Hans提出此建议。
首先将TablessControl的SizeMode
设置为“固定”,然后减少TablessControl的ItemSize
Width
属性以减小每个选项卡的宽度。也可以自由地调整ItemSize
Height
属性以帮助解决上述WYSIWYG问题,但是解决方案3可能更有帮助。
此解决方案可与以上解决方案结合使用以进一步累积优势。
tcActionControls.Region = new Region(new RectangleF(
tbPageToShow.Left,
tbPageToShow.Top,
tbPageToShow.Width,
tbPageToShow.Height)
);
这应该能满足您的需求: tcActionControls
是您的 TabControl
,而 tbPageToShow
则是此时要显示的 TabPage
。
应该可以为您工作。
祝好。
将TabControl插入到表单中,默认名称为TabControl1。
确保在Visual Studio的属性窗格中选择TabControl1并更改以下属性:
a. 将Appearance设置为Buttons
b. 将ItemSize的宽度设置为0,高度设置为1
c. 将Multiline设置为True
d. 将SizeMode设置为Fixed
最好在完成设计时任务后再执行此操作,因为它还会将它们隐藏在设计器中 - 这使得导航变得困难!
foreach (TabPage tp in tabCol)
{
if(condition)
{
tabCol.Remove(tp);
}
}
private void frmOptions_Load(object sender, EventArgs e)
{
tabControl1.Top = -23; //Only tabPage contents visible
}
myPanelTabs(n).BringToFront
完成。或者更改可见性。 - Ňɏssa PøngjǣrdenlarpDesignMode
吧?虽然可以创建一个 UserControl,但这将取消标准 TabControl 提供的功能,所以我猜这样的答案可能会非常复杂。如果你认为编码很简单,那么请添加一个答案(不过,除非它也解决了赏金问题,否则这样的答案与我提供的赏金无关)。 - Dan W