Настройка TabControl для закрытия отдельных вкладок
Мой сценарий следующий:
Я работаю над приложением winforms на С#, у которого есть кнопка внутри главной страницы tabcontrol, которая будет генерировать другую вкладку каждый раз, когда она будет нажата. Каждая новая вкладка будет содержать макет, определенный пользовательским элементом управления.
Мои вопросы:
-
Как я могу позволить пользователю закрыть одну из вкладок, которые были созданы динамически во время выполнения?
-
Как мне изменить модификацию самого tabcontrol, чтобы на каждой вкладке было маленькое "X", которое пользователь может щелкнуть, чтобы закрыть эту конкретную вкладку? (Как и Firefox)
-
Как я могу открыть свойство SelectedIndex элемента управления tabcontrol для пользовательского элемента управления, если я хочу закрыть вкладку с помощью кнопки внутри пользовательского элемента управления?
Ответы
Ответ 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);
Ответ 5
Я знаю, что это старый поток, но я нашел ссылку которая позволит вам скрывать вкладки в массиве, а затем вы можно просто повторно загрузить вкладки, которые вы хотите во время выполнения. Я добавил это больше для места, где я могу легко найти его снова.
Ответ 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);