19

我的情况如下:

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

我的问题是:

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

  2. 我该如何修改 tabcontrol 本身,使其在每个选项卡中都有一个小“X”,用户可以单击它以关闭该特定选项卡?(就像 Firefox 一样)

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

4

7 回答 7

14

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

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:如何捕获鼠标右键单击选项卡

于 2010-11-25T18:05:21.960 回答
10

大约一年前,我创建了一个派生的选项卡控件。我不打算在这里发布源代码,因为它大约有 700 行长并且编码非常混乱。也许我会找时间清理一下代码,然后在这里发布。现在我将简要概述它的构建方式。

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

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

您可以测试鼠标是否在TabControl.GetTabRect()特定的标签页上,并通过一些数学运算发现它是否在图标上。然后你只需要根据鼠标按钮的状态改变图标,如果按钮被按下,最终删除鼠标下的标签页。

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

于 2009-04-29T18:38:00.130 回答
6

我做了以下事情:在创建(添加)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);

添加toolstriptabpage

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);
}

也许它不是你想要的,但它会很好地工作。

于 2012-05-24T22:07:47.140 回答
2

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

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

我在基本控件上使用的关闭选项卡代码:

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

tabControl.TabPages.Remove(parent);
于 2009-04-29T19:53:29.980 回答
1

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

于 2011-09-22T00:00:24.263 回答
0

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

            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;
                    }
                }
            }
于 2015-08-07T08:04:26.317 回答
-3

其作品!

TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(tabpage);
于 2015-04-24T21:06:25.273 回答