TabControl在运行时重命名

Ch3*_*ire 3 c# winforms

我正在尝试创建简单的界面,用户可以在TabControl中重命名选项卡.问题是因为我可以通过GetTabRect方法获取制表符的位置,所以我无法将TextBox设置为制表符的位置.这是期望的效果(来自foobar):

在此输入图像描述

这是我的效果:

在此输入图像描述

下面我插入我的代码,我尝试产生这种效果:

      private void renameToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (selectedTab >= 0 && selectedTab < MainTabs.TabCount)
        {
            Debug.WriteLine("Rename " + MainTabs.Controls[selectedTab].Text);
            Debug.WriteLine(sender.ToString());

            //var CurrentTab = MainTabs.TabPages[selectedTab];
            //TabControl tabControl = MainTabs.Con

            Rectangle rect = MainTabs.GetTabRect(selectedTab);
            Point point = MainTabs.Location;

            Debug.WriteLine(point.ToString() + " " + rect.ToString());

            RenameBox = new TextBox();

            MainTabs.GetControl(selectedTab).Controls.Add(RenameBox);

            //MainTabs

            RenameBox.Show();

            RenameBox.SetBounds(rect.X, rect.Y, rect.Width, rect.Height);


            //MainTab.Controls.Add(RenameBox);
            //this.Controls.Add(RenameBox);
            //components.Add(RenameBox);

            //RenameBox.Location = point;

            //MainTabs.SelectedTab.Controls.Add(RenameBox);

            //MainTabs.GetControl(0).Controls.Add(RenameBox);

            //MainTabs.SelectedTab.

            RenameBox.KeyPress += textBox1_KeyPress;
            //RenameBox.Show();
            //RenameBox.Location = new Point(0, 0);
            //RenameBox.Focus();
            //RenameBox.SetBounds(.GetTabRect(selectedTab));

        }
    }
Run Code Online (Sandbox Code Playgroud)

我应该如何更改代码以便能够在运行时重命名Tab名称?

Han*_*ant 5

GetTabRect()返回相对于选项卡控件的位置.但是您要将文本框添加到标签页,它位于标签页下方.这就是为什么你的截图看起来像这样.你不能给文本框一个负面的位置,它会被剪裁.理想情况下,您可以将其添加到选项卡控件,但TabControl显式禁止此操作.您可以做的唯一其他事情是将其添加到表单中.

您必须计算正确的位置,将tabrect映射到表格坐标.并确保它与tabcontrol重叠.再次删除它肯定最好用它的Leave事件完成.像这样:

private TextBox AddTextBoxToTab(TabControl tabctl, int index = -1) {
    if (index < 0) index = tabctl.SelectedIndex;
    var rc = tabctl.GetTabRect(index);
    rc = tabctl.RectangleToScreen(rc);
    rc = tabctl.Parent.RectangleToClient(rc);
    var box = new TextBox();
    box.Font = tabctl.Font;
    box.Leave += delegate { box.Dispose(); };
    box.SetBounds(rc.Left, rc.Top, rc.Width, rc.Height);
    tabctl.Parent.Controls.Add(box);
    box.BringToFront();
    box.Focus();
    return box;
}
Run Code Online (Sandbox Code Playgroud)