自定义TabControl以关闭单个选项卡

我的方案如下:

我正在使用C#中的winforms应用程序,它在tabcontrol的主页面内有一个按钮,每次单击它时都会生成另一个tabpage。 每个新标签页都将包含由用户控件定义的布局。

我的问题是:

  1. 如何允许用户关闭在运行时动态创建的其中一个选项卡?

  2. 我该如何修改tabcontrol本身,以便在每个标签中都有一个小的“X”,用户可以点击该标签以关闭该特定标签? (像Firefox一样)

  3. 如果我想使用用户控件内的按钮关闭选项卡,如何将tabcontrol的SelectedIndex属性公开给用户控件?

我大约一年前创建了一个派生标签控件。 我不会在这里发布消息来源,因为它大约有700行,并且编码非常混乱。 也许我会找一些时间来清理代码然后在这里发布它。 现在我将简要介绍它的构建方式。

每个标签页在标题左侧都有一个“X”图标,标签页支持通过拖放重新排序并在多个标签控件之间移动它们。

我选择了在标签页上获取图标的简便方法。 选项卡控件具有TabControl.ImageList属性,标签页具有TabPage.ImageIndex属性。 所以我只是在图像列表中添加了三个图标 – 正常,hover,按下 – 并处理鼠标事件。

使用TabControl.GetTabRect()您可以测试鼠标是否在特定选项卡页面上,并且如果它位于图标上方,您可以通过一些数学运算来查看。 然后,您只需根据鼠标按钮状态更改图标,如果按下按钮,最终会删除鼠标下的标签页。

此解决方案的主要问题是,计算鼠标是否在图标上方需要知道图标相对于标签页的绘制位置,这可能会随着新的Windows版本而改变。 图标位于标题的左侧,但这看起来并不太糟糕。

我找到了这段代码,对我很有帮助:

 private void tabControl_MouseUp(object sender, MouseEventArgs e) { // check if the right mouse button was pressed if(e.Button == MouseButtons.Right) { // iterate through all the tab pages for(int i = 0; i < tabControl1.TabCount; i++) { // get their rectangle area and check if it contains the mouse cursor Rectangle r = tabControl1.GetTabRect(i); if (r.Contains(e.Location)) { // show the context menu here System.Diagnostics.Debug.WriteLine("TabPressed: " + i); } } } } 

TabControl:如何捕获鼠标右键单击“选项卡”

我做了以下操作:在创建(添加) TabPage阶段,我添加了一个toolStrip

 ToolStrip ts = new ToolStrip(); ts.Dock = DockStyle.Top; ts.RightToLeft = System.Windows.Forms.RightToLeft.Yes; 

然后,创建X按钮并将其添加到toolstrip

 ToolStripButton ToolStripButton = new ToolStripButton("X"); ts.Items.Add(ToolStripButton); 

单击X按钮创建一个事件

 ToolStripButton.Click += new EventHandler(ToolStripButton_Click); 

toolstrip tabpage添加到tabpage

 tabControl1.TabPages[curenttabpage].Controls.Add(ts); 

现在ToolStripButton_Click如下:

 void ToolStripButton_Click(object sender, EventArgs e) { ToolStripButton t = (ToolStripButton)(sender); ToolStrip ts = t.Owner; TabPage tb = (TabPage) (ts.Parent);tabControl1.TabPages.Remove(tb); } 

也许它不是你想要的,但它会运作良好。

我创建了一个类似的设置。

在运行时添加到选项卡页面的每个控件都是从我创建的特殊基本控件派生的。 这个基本控件有一个关闭按钮(以及一些其他function,如安全关闭标志)。

关闭我在基本控件上使用的标签代码:

  TabPage tabpage = (TabPage)this.Parent; TabControl tabControl = (TabControl)tabpage.Parent; tabControl.TabPages.Remove(parent); 

我知道这是一个旧线程,但我确实找到了这个链接 ,允许您“隐藏”数组中的选项卡,然后您可以在运行时重新加载所需的选项卡。 我把它添加到一个我可以轻易找到的地方。

此代码可能有助于通过鼠标中键单击关闭选项卡控件:

  private void tabControl1_MouseDown(object sender, MouseEventArgs e) { if (e.Button != System.Windows.Forms.MouseButtons.Middle) return; for (int i = 0; i < MainTabControl.TabPages.Count; i++) { if (this.MainTabControl.GetTabRect(i).Contains(e.Location)) { this.MainTabControl.TabPages.RemoveAt(i); return; } } } 

其作品!

 TabPage tabpage = (TabPage)this.Parent; TabControl tabControl = (TabControl)tabpage.Parent; tabControl.TabPages.Remove(tabpage);