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)
Geo*_*aph 23
tabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;
Run Code Online (Sandbox Code Playgroud)
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
.
希望有所帮助.
小智 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)
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#中的答案
为了补充Hans Passant现有的答案,当Tab的数量超过TablessControl的宽度时,我发现了四种隐藏用户箭头的方法.没有一种解决方案对每个人来说都是完美的,但可能适合你(或者至少是它们的组合).
简单地启用Multiline
.这样可以防止箭头出现在第一位.但是,请记住,您可能会在设计器中失去WYSIWYG,因为垂直空间将垂直向下调整,而TablessControl中的控件甚至可能会在底部"切断"(同样,仅在开发人员模式下).
解决上述WYSIWYG问题的更高级解决方案是仅Multiline
在程序运行后启用.只需将此构造函数添加到TablessControl类:
public TablessControl()
{
bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
if (!designMode) Multiline = true;
}
Run Code Online (Sandbox Code Playgroud)
对于开发人员来说,它们仍然会显示为一行标签.
减小TablessControl的字体大小.每个标签应相应缩小.由于用户永远不会看到标签,因此如果将字体大小设置为甚至4pt,则无关紧要.
但要小心,因为TablessControl的内容也可能会调整大小.如果发生这种情况,请重新编辑内部每个小部件的字体大小,此时,即使您决定再次重新更改主TablessControl的字体大小,他们也会感激地保持该大小.
这种方法还具有向开发人员更密切地显示真正的WYSIWYG垂直空间的优点(对于用户来说看起来很好,但由于标签的高度,可能会在设计者的底部略微切断).
该解决方案可以与解决方案1和2组合以获得累积的优势.
如果任何标签具有很长的文本,则该解决方案不一定非常好.感谢Hans提出建议.
首先将TablessControl设置SizeMode
为"Fixed",然后将TablessControl的ItemSize
Width
属性减少为较小的数字以减小每个选项卡的宽度.也可以随意调整ItemSize
Height
属性以帮助解决上述WYSIWYG问题,尽管解决方案3可能对此问题更有帮助.
该解决方案可以与上述解决方案组合以进一步积累优势.
如果你真的想这样做,你可以做这样的事情
tcActionControls.Region = new Region(new RectangleF(
tbPageToShow.Left,
tbPageToShow.Top,
tbPageToShow.Width,
tbPageToShow.Height)
);
Run Code Online (Sandbox Code Playgroud)
哪里tcActionControls
是你的TabControl
,并tbPageToShow
是TabPage
在这个精确时刻显示。
应该为你工作。
问候。
归档时间: |
|
查看次数: |
43395 次 |
最近记录: |