Подтвердить что ты не робот

Настройка TabControl для закрытия отдельных вкладок

Мой сценарий следующий:

Я работаю над приложением winforms на С#, у которого есть кнопка внутри главной страницы tabcontrol, которая будет генерировать другую вкладку каждый раз, когда она будет нажата. Каждая новая вкладка будет содержать макет, определенный пользовательским элементом управления.

Мои вопросы:

  • Как я могу позволить пользователю закрыть одну из вкладок, которые были созданы динамически во время выполнения?

  • Как мне изменить модификацию самого tabcontrol, чтобы на каждой вкладке было маленькое "X", которое пользователь может щелкнуть, чтобы закрыть эту конкретную вкладку? (Как и Firefox)

  • Как я могу открыть свойство SelectedIndex элемента управления tabcontrol для пользовательского элемента управления, если я хочу закрыть вкладку с помощью кнопки внутри пользовательского элемента управления?

4b9b3361

Ответ 1

Я создал контрольный элемент tab tab около года назад. Я не собираюсь размещать источник здесь, потому что это около 700 строк в длину и закодировано довольно грязно. Может быть, я найду какое-то время, чтобы очистить код и отпустить его здесь. На данный момент я кратко опишу способ его сборки.

Каждая закладка имеет значок "X" слева от заголовка, а страницы вкладок поддерживают переупорядочение путем перетаскивания и перемещения между несколькими элементами управления вкладками.

Я выбираю простой способ получить значок на вкладках. Элемент управления вкладкой имеет свойство TabControl.ImageList, а вкладка имеет TabPage.ImageIndex. Поэтому я просто добавил три значка в список изображений - обычный, наведите курсор, нажал - и обработал события мыши.

С TabControl.GetTabRect() вы можете проверить, находится ли мышь над определенными страницами вкладки и с некоторой математикой, которую вы находите, если она находится над значком, Затем вам просто нужно изменить значок в зависимости от состояния кнопки мыши и в конечном итоге удалить страницу закладки под мышью, если кнопка была нажата.

Основная проблема с этим решением заключается в том, что вычисление, если мышь находится над значком, требует знать, где значок окрашен относительно закладки, и это может измениться с новой версией Windows. И значок находится слева от названия, но это выглядит не так уж плохо.

Ответ 2

Я нашел этот код и очень помог мне:

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: как запечатлеть мышь правой кнопкой мыши на вкладке

Ответ 3

Я сделал следующее: на этапе create (add) TabPage я добавил a 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

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

Возможно, это не так, как вы хотите, но он будет работать хорошо.

Ответ 4

Я создал настройку, которая похожа.

Каждый элемент управления, который добавляется на вкладку во время выполнения, выводится из специального базового элемента управления, который я создал. Этот базовый элемент управления имеет кнопку закрытия (наряду с некоторыми другими функциями, такими как безопасный для закрытия флага).

Закрыть код вкладки Я использую мой базовый элемент управления:

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

tabControl.TabPages.Remove(parent);

Ответ 6

Этот код может помочь закрывать элементы управления вкладками средним щелчком мыши:

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

Ответ 7

Это работает!

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