Вопрос

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

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

Мои вопросы:

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

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

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

Это было полезно?

Решение

Около года назад я создал производный элемент управления вкладками.Я не собираюсь публиковать здесь исходный код, потому что он занимает около 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);
             }
        }
    }
}

Табконтрол:Как захватить щелчок правой кнопкой мыши на вкладке

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

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

Я создал аналогичную установку.

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

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

 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top