есть ли кто-нибудь, кто может сказать мне, как добавить кнопку закрытия на каждой вкладке, используя tabControl в С#? Я планирую использовать кнопку pic для замены [x] на моей вкладке.
Благодарю вас
есть ли кто-нибудь, кто может сказать мне, как добавить кнопку закрытия на каждой вкладке, используя tabControl в С#? Я планирую использовать кнопку pic для замены [x] на моей вкладке.
Благодарю вас
Не вызывая класс, вот аккуратный фрагмент: http://www.dotnetthoughts.net/implementing-close-button-in-tab-pages/
Задайте свойство DrawMode элемента управления вкладкой OwnerDrawFixed. Это свойство решает, будет ли система или разработчик рисовать надписи. Добавьте код в событие DrawItem элемента управления Tab. Это событие будет вызываться для рисования каждой страницы вкладки.
//This code will render a "x" mark at the end of the Tab caption.
e.Graphics.DrawString("x", e.Font, Brushes.Black, e.Bounds.Right - 15, e.Bounds.Top + 4);
e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + 12, e.Bounds.Top + 4);
e.DrawFocusRectangle();
Теперь для закрытия действия кнопки нам нужно добавить следующий код в событие MouseDown элемента управления вкладкой.
//Looping through the controls.
for (int i = 0; i < this.tabControl1.TabPages.Count; i++)
{
Rectangle r = tabControl1.GetTabRect(i);
//Getting the position of the "x" mark.
Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7);
if (closeButton.Contains(e.Location))
{
if (MessageBox.Show("Would you like to Close this Tab?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
this.tabControl1.TabPages.RemoveAt(i);
break;
}
}
}
Добавление к другим ответам... почему итерация по всем вкладкам при щелчке мыши, когда мы можем просто обнаружить текущую вкладку с помощью .SelectedIndex и .SelectedTab?
Так же:
private void tabControl1_MouseDown(object sender, MouseEventArgs e)
{
Rectangle r = tabControl1.GetTabRect(this.tabControl1.SelectedIndex);
Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7);
if (closeButton.Contains(e.Location))
{
this.tabControl1.TabPages.Remove(this.tabControl1.SelectedTab);
}
}
Кажется, что, как только вы нажимаете на tabPage для его закрытия, он также выбирается, поэтому кнопка закрытия закрывает правую вкладку. Для меня это работает, но, пожалуйста, обратите на это с особой осторожностью, хотя я не совсем уверен в возможных недостатках (мое первоначальное предложение не было совершенно риторическим вопросом, так как я новичок в .Net...).
Попробуйте этот код:
private Point _imageLocation = new Point(13, 5);
private Point _imgHitArea = new Point(13, 2);
private void Form1_Load(object sender, EventArgs e)
{
tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
tabControl1.DrawItem += tabControl1_DrawItem;
CloseImage = WindowsFormsApplication3.Properties.Resources.closeR;
tabControl1.Padding = new Point(10, 3);
}
private void TabControl1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
try
{
Image img = new Bitmap(CloseImage);
Rectangle r = e.Bounds;
r = this.tabControl1.GetTabRect(e.Index);
r.Offset(2, 2);
Brush TitleBrush = new SolidBrush(Color.Black);
Font f = this.Font;
string title = this.tabControl1.TabPages[e.Index].Text;
e.Graphics.DrawString(title, f, TitleBrush, new PointF(r.X, r.Y));
if (tabControl1.SelectedIndex >= 1)
{
e.Graphics.DrawImage(img, new Point(r.X + (this.tabControl1.GetTabRect(e.Index).Width - _imageLocation.X), _imageLocation.Y));
}
}
catch (Exception) { }
}
private void TabControl1_Mouse_Click(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
TabControl tc = (TabControl)sender;
Point p = e.Location;
int _tabWidth = 0;
_tabWidth = this.tabControl1.GetTabRect(tc.SelectedIndex).Width - (_imgHitArea.X);
Rectangle r = this.tabControl1.GetTabRect(tc.SelectedIndex);
r.Offset(_tabWidth, _imgHitArea.Y);
r.Width = 16;
r.Height = 16;
if (tabControl1.SelectedIndex >= 1)
{
if (r.Contains(p))
{
TabPage TabP = (TabPage)tc.TabPages[tc.SelectedIndex];
tc.TabPages.Remove(TabP);
}
}
}
Посмотрите этот фрагмент кода