Кнопка «Закрыть» на вкладке «Управление» - PullRequest
28 голосов
/ 06 июля 2010

есть кто-нибудь, может сказать мне, как добавить кнопку закрытия в каждой вкладке в использовании tabControl в C #? я планирую использовать кнопку рис для замены [x] в моей вкладке ..

спасибо

Ответы [ 3 ]

54 голосов
/ 24 февраля 2013

Без извлечения класса приведем аккуратный фрагмент: 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;
        }
    }
}
7 голосов
/ 17 марта 2016

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

Похоже, что в тот момент, когда вы нажимаете на вкладку для ее закрытия, она также выбирается, что позволяет кнопке закрытия закрыть правую вкладку.Для меня это работает, но, пожалуйста, отнеситесь к этому с особой осторожностью, поскольку я не совсем уверен в возможных недостатках (мое первоначальное предложение не было полностью риторическим вопросом, поскольку я вроде как новичок в .Net ...).

1 голос
/ 14 января 2017

Попробуйте этот код:

    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);
    }

}
}

Посмотрите на этот фрагмент кода

...