it-roy-ru.com

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

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

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

Мои вопросы:

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

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

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

18
THE DOCTOR

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

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

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

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

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

9
Daniel Brückner

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

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

14
Vallel

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

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

6
Muhammad Hamad

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

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

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

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

tabControl.TabPages.Remove(parent);
2
Crispy

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

1
Mark Kram

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

            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
Mohammad Chamanpara