Настройка TabControl для закрытия отдельных вкладок - PullRequest
18 голосов
/ 29 апреля 2009

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

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

Мои вопросы:

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

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

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

Ответы [ 7 ]

14 голосов
/ 25 ноября 2010

Я нашел этот код и был очень полезен для меня:

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

9 голосов
/ 29 апреля 2009

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

На каждой вкладке имеется значок «X» для слева заголовка, а страницы вкладок поддерживают переупорядочение путем перетаскивания и перемещения их между несколькими вкладками.

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

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

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

6 голосов
/ 25 мая 2012

Я сделал следующее: на этапе создания (добавления) 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 к 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);
}

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

2 голосов
/ 29 апреля 2009

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

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

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

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

tabControl.TabPages.Remove(parent);
1 голос
/ 22 сентября 2011

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

0 голосов
/ 07 августа 2015

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

            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;
                    }
                }
            }
0 голосов
/ 25 апреля 2015

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

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