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

THE*_*TOR 18 c# user-interface controls tabcontrol winforms

我的方案如下:

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

我的问题是:

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

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

  3. 如果我想用用户控件中的按钮关闭选项卡,我怎样才能将tabcontrol的SelectedIndex属性公开给用户控件呢?

小智 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);
             }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*ner 9

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

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

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

有了TabControl.GetTabRect()你可以测试鼠标在一个特定的标签页,并与一些数学你会发现,如果它是在图标上.然后,您只需根据鼠标按钮状态更改图标,如果按下按钮,最终会删除鼠标下的标签页.

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


小智 6

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

ToolStrip ts = new ToolStrip();
ts.Dock = DockStyle.Top;
ts.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
Run Code Online (Sandbox Code Playgroud)

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

ToolStripButton ToolStripButton = new ToolStripButton("X");
ts.Items.Add(ToolStripButton);
Run Code Online (Sandbox Code Playgroud)

单击X按钮创建一个事件

ToolStripButton.Click += new EventHandler(ToolStripButton_Click);
Run Code Online (Sandbox Code Playgroud)

添加toolstriptabpage

tabControl1.TabPages[curenttabpage].Controls.Add(ts);
Run Code Online (Sandbox Code Playgroud)

现在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);
}
Run Code Online (Sandbox Code Playgroud)

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