Pergunta

Meu cenário é o seguinte:

Eu estou trabalhando em um aplicativo winforms em C # que tem um botão dentro da página principal de um tabcontrol que irá gerar outro TabPage cada vez que é clicado. Cada novo TabPage irá conter um layout definido por um controle de usuário.

Minhas perguntas são:

  1. Como posso permitir que o usuário feche uma das guias que foram criados dinamicamente em tempo de execução?

  2. Como eu poderia ir sobre como modificar o próprio tabcontrol para que ele tenha um pequeno 'X' em cada guia que o usuário pode clicar em para fechar esse particular guia? (Como o Firefox tem)

  3. Como posso expor a propriedade SelectedIndex do tabcontrol para o controle de usuário, se eu quiser fechar a guia com um botão dentro do controle de usuário em vez disso?

Foi útil?

Solução

Eu criei um controle guia derivada cerca de um ano atrás. Eu não estou indo para postar a fonte aqui, porque é sobre 700 linhas longas e codificadas bastante confuso. Talvez eu vou encontrar algum tempo para limpar o código e depois liberá-lo aqui. Por agora vou descrever brevemente do jeito que está construção.

Cada aba tem um 'X' ícone para o esquerdo do título e as páginas guia Suporte reordenação por arrastar e soltar e movê-los entre o controle guia múltipla.

I escolher o caminho mais fácil para obter o ícone nas páginas de guia. O controle guia tem a propriedade TabControl.ImageList e uma página de guia tem um TabPage.ImageIndex propriedade. Então, eu só acrescentou três ícones para a lista de imagem - normal, pairar, pressionado -. E processar os eventos do mouse

Com TabControl.GetTabRect() você pode teste se o mouse está sobre um páginas de guia específicas e com um pouco de matemática que você descobrir se ele é sobre o ícone. Então você só precisa mudar o ícone, dependendo do estado botão do mouse e, eventualmente, eliminar a página da guia sob o mouse se o botão foi pressionado.

O principal problema com esta solução é que calcular se o mouse está sobre o ícone exige saber onde o ícone é pintado em relação à página guia e essa mudança poder com uma nova versão do Windows. Eo ícone é para a esquerda do título, mas isso não parece tão ruim.

Outras dicas

Eu encontrei este código e foi muito útil para mim:

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: Como Capturar mouse Right-Click na Tab

Eu fiz o seguinte: no palco TabPage criar (ADD), eu adicionei um toolStrip

ToolStrip ts = new ToolStrip();
ts.Dock = DockStyle.Top;
ts.RightToLeft = System.Windows.Forms.RightToLeft.Yes;

Em seguida, crie o botão X e adicioná-lo à toolstrip

ToolStripButton ToolStripButton = new ToolStripButton("X");
ts.Items.Add(ToolStripButton);

criar um evento no clicando no botão X

ToolStripButton.Click += new EventHandler(ToolStripButton_Click);

add toolstrip ao tabpage

tabControl1.TabPages[curenttabpage].Controls.Add(ts);

agora para o ToolStripButton_Click é o seguinte:

void ToolStripButton_Click(object sender, EventArgs e)
{ 
 ToolStripButton t = (ToolStripButton)(sender);
 ToolStrip ts = t.Owner;
 TabPage tb = (TabPage)
 (ts.Parent);tabControl1.TabPages.Remove(tb);
}

Talvez não é como você quer, mas ele vai funcionar bem.

Eu criei uma configuração semelhante.

Cada controle que é adicionado à página da guia em tempo de execução é derivada de um controle base especial que eu criei. Este controle base tem um botão de fechar (junto com algumas outras características, tais como seguro bandeira perto).

Fechar código guia eu estou usando no meu controle de base:

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

tabControl.TabPages.Remove(parent);

Eu sei que esta é uma discussão antiga, mas eu fiz encontrar este href="http://www.syncfusion.com/FAQ/windowsforms/faq_c93c.aspx#q642q" rel="nofollow"> ligação que lhe permitirá tabs "esconder" em uma matriz e, em seguida, você pode simplesmente recarregar as abas que você quer em tempo de execução. Eu adicionei este mais para um lugar que eu possa facilmente encontrá-lo novamente.

Esta força de código ajuda throgh fechando os controles de guia com meio clique do mouse:

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

IT'S funciona!

TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(tabpage);
scroll top