【发布时间】:2011-07-18 19:16:50
【问题描述】:
如何在 Windows 窗体应用程序中将 + 按钮添加到 TabControl。这是WPF 的答案。但我想在 WinForms 应用程序中使用它?
【问题讨论】:
标签: c# winforms button tabs tabcontrol
如何在 Windows 窗体应用程序中将 + 按钮添加到 TabControl。这是WPF 的答案。但我想在 WinForms 应用程序中使用它?
【问题讨论】:
标签: c# winforms button tabs tabcontrol
您可以在控件标签的末尾添加一个新标签并将其文本设置为+,然后:
然后您将拥有一个如下所示的选项卡控件。为了有更大的选项卡按钮,我在控件上应用了填充。
Hande 点击最后一个标签
您可以处理MouseDown或MouseClick事件并检查最后一个tab矩形是否包含鼠标点击点,然后在最后一个tab之前插入一个tab:
private void tabControl1_MouseDown(object sender, MouseEventArgs e)
{
var lastIndex = this.tabControl1.TabCount - 1;
if (this.tabControl1.GetTabRect(lastIndex).Contains(e.Location))
{
this.tabControl1.TabPages.Insert(lastIndex, "New Tab");
this.tabControl1.SelectedIndex = lastIndex;
}
}
防止选择最后一个标签
为了防止选择最后一个标签,可以处理Selecting控制事件,并检查选择的标签是否是最后一个标签,取消该事件:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPageIndex == this.tabControl1.TabCount - 1)
e.Cancel = true;
}
调整标签宽度
要调整标签宽度并让最后一个标签具有较小的宽度,您可以处理HandleCreated 事件并向控件发送TCM_SETMINTABWIDTH 并指定标签宽度允许的最小尺寸:
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
private const int TCM_SETMINTABWIDTH = 0x1300 + 49;
private void tabControl1_HandleCreated(object sender, EventArgs e)
{
SendMessage(this.tabControl1.Handle, TCM_SETMINTABWIDTH, IntPtr.Zero, (IntPtr)16);
}
注意
您可以简单地将逻辑封装在派生的TabContol 中,并制作一个支持添加选项卡的自定义选项卡控件。
关闭按钮:您也可以简单地使控件所有者绘制并处理选项卡的绘制以在选项卡上显示+ 图标和X 图标。作为示例,您可以在这篇文章中看到一个实现:TabControl with Close and Add Button。
从右到左 (RTL) 支持:您可以在使用自绘标签时添加对 RTL 的支持。这个帖子:Close button for TabPages of Right To Left TabControl 是一个解决方案。
【讨论】:
我将添加一个新的 TabPage,然后将标题设置为“+”,将其名称设置为 newTabPage,并为 TabControl 的 SelectedIndexChanged 添加一个事件。然后你只需检查是否
tabcontrol.SelectedTab == newTabPage
如果是这种情况,您可以创建一个新的 TabPage,将其插入 tabControl 并将其设置为 SelectedTab,如下所示:
tabControl.TabPages.Insert(tabControl.TabPages.Count - 1, createdTabPage);
tabControl.SelectedTab = createdTabPage;
【讨论】:
HandleCreated 事件并将TCM_SETMINTABWIDTH 发送到控件并指定标签宽度允许的最小尺寸。在这里我分享了一个answer,它可以调整标签的宽度。
使用标签“+”创建一个标签,并使用“tabControl1_Selecting”事件,代码如下:
if(e.TabPageIndex==tabControl1.TabPages.Count-1)
tabControl1.TabPages.Insert(tabControl1.TabPages.Count - 1,"tab"+e.TabPageIndex);
【讨论】:
根据@Reza Aghaei 的一些改进
现在输入这些代码:
private void Form1_Load(object sender, EventArgs e)
{
TabPage tab = tabControl1.TabPages[0];
var newTab = new formTab();
newTab.TopLevel = false;
newTab.Dock = DockStyle.Fill;
newTab.Show();
newTab.Visible = true;
tab.Controls.Add(newTab);
}
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
var tabAdd = tabControl1.TabCount - 1;
if (tabControl1.SelectedIndex == tabAdd)
{
//create a new tabpage
var t = new TabPage();
//create a new formTab with webControl in it
var newTab = new formTab();
//show the new formTab
newTab.Show();
newTab.TopLevel = false;
newTab.Dock = DockStyle.Fill;
newTab.Visible = true;
//add formTab as new control in the tabpage just created
t.Controls.Add(newTab);
//insert the new created tab into tab control and before tabLoc
tabControl1.TabPages.Insert(tabAdd, t);
//select the new created tab
var newCreatedTab = tabControl1.TabCount - 2;
tabControl1.SelectedIndex = newCreatedTab;
}
}
希望对你有帮助!
【讨论】: