自定义TabControl以关闭单个选项卡
-
03-07-2019 - |
题
我的方案如下:
我正在使用C#中的winforms应用程序,它在tabcontrol的主页面内有一个按钮,每次单击它时都会生成另一个tabpage。每个新标签页都将包含由用户控件定义的布局。
我的问题是:
-
如何让用户关闭其中一个在运行时动态创建的标签?
-
我如何修改tabcontrol本身,以便每个标签中都有一个小的“X”,用户可以点击该标签以关闭该特定标签? (像Firefox一样)
-
如果我想使用用户控件内的按钮关闭选项卡,如何将tabcontrol的SelectedIndex属性公开给用户控件?
醇>
解决方案
我在大约一年前创建了一个派生标签控件。我不会在这里发布消息来源,因为它大约有700行,并且编码非常混乱。也许我会找一些时间来清理代码然后在这里发布它。现在我将简要介绍它的构建方式。
每个标签页都有一个标有左侧的“X”图标,标签页支持通过拖放重新排序并在多个标签控件之间移动它们。
我选择了在标签页上获取图标的简便方法。选项卡控件具有 TabControl.ImageList
属性和标签页有一个 TabPage.ImageIndex
属性。所以我只是在图像列表中添加了三个图标 - 正常,悬停,按下 - 并处理鼠标事件。
使用 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);
}
}
}
}
我做了以下事情:
在create(add) 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
添加到标签页
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);
}
也许它不是你想要的,但它会很好用。
我创建了一个类似的设置。
在运行时添加到选项卡页面的每个控件都是从我创建的特殊基本控件派生的。这个基本控件有一个关闭按钮(以及一些其他功能,如安全关闭标志)。
关闭我在基本控件上使用的标签代码:
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);