Compartilhar via


Arquitetura de controle ToolStrip

As classes ToolStrip e ToolStripItem fornecem um sistema flexível e extensível para exibir itens de barra de ferramentas, status e menu. Essas classes estão todas contidas no namespace System.Windows.Forms e normalmente são nomeadas com o prefixo "ToolStrip" (como ToolStripOverflow) ou com o sufixo "Strip" (como MenuStrip).

ToolStrip

Os tópicos a seguir descrevem ToolStrip e os controles que derivam dele.

ToolStrip é a classe base abstrata para MenuStrip, StatusStripe ContextMenuStrip. O modelo de objeto a seguir mostra a hierarquia de herança ToolStrip.

Diagrama que mostra o modelo de objeto ToolStrip.

Você pode acessar todos os itens em um ToolStrip por meio da coleção Items. Você pode acessar todos os itens em um ToolStripDropDownItem por meio da coleção DropDownItems. Em uma classe derivada de ToolStrip, você também pode usar a propriedade DisplayedItems para acessar apenas os itens exibidos no momento. Estes são os itens que não estão atualmente em um menu de estouro.

Os itens a seguir são projetados especificamente para funcionar perfeitamente com ToolStripSystemRenderer e ToolStripProfessionalRenderer em todas as orientações. Eles estão disponíveis por padrão, durante o tempo de design, para o controle ToolStrip:

MenuStrip é o contêiner de nível superior que substitui MainMenu. Ele também fornece tratamento de chave e vários recursos de MDI (interface de documento). Funcionalmente, ToolStripDropDownItem e ToolStripMenuItem funcionam junto com MenuStrip, embora sejam derivados de ToolStripItem.

Os itens a seguir são projetados especificamente para funcionar perfeitamente com ToolStripSystemRenderer e ToolStripProfessionalRenderer em todas as orientações. Eles estão disponíveis por padrão, durante o tempo de design, para o controle MenuStrip:

StatusStrip

StatusStrip substitui o controle StatusBar. Recursos especiais de StatusStrip incluem um layout de tabela personalizado, suporte para as alças de dimensionamento e deslocamento do formulário e a propriedade Spring, que permite que um ToolStripStatusLabel preencha automaticamente o espaço disponível.

Os itens a seguir são projetados especificamente para funcionar perfeitamente com ToolStripSystemRenderer e ToolStripProfessionalRenderer em todas as orientações. Eles estão disponíveis por padrão, durante o tempo de design, para o controle StatusStrip:

ContextMenuStrip

ContextMenuStrip substitui ContextMenu. Você pode associar um ContextMenuStrip a qualquer controle e um clique com o botão direito do mouse exibe automaticamente o menu de contexto (ou menu de atalho). Você pode mostrar um ContextMenuStrip programaticamente usando o método Show. ContextMenuStrip dá suporte a eventos de Opening e Closing canceláveis para lidar com a população dinâmica e cenários com múltiplos cliques. ContextMenuStrip dá suporte a imagens, estado de verificação de item de menu, texto, chaves de acesso, atalhos e menus em cascata.

Os itens a seguir são projetados especificamente para funcionar perfeitamente com ToolStripSystemRenderer e ToolStripProfessionalRenderer em todas as orientações. Eles estão disponíveis por padrão no momento do design para o controle ContextMenuStrip.

Funcionalidades genéricas do ToolStrip

Os tópicos a seguir descrevem recursos e comportamentos genéricos para o ToolStrip e controles derivados.

Pintura

Você pode fazer pintura personalizada em controles ToolStrip de várias maneiras. Assim como acontece com outros controles do Windows Forms, os ToolStrip e ToolStripItem têm métodos OnPaint substituíveis e eventos de Paint. Assim como ocorre com pintura regular, o sistema de coordenadas é relativo à área de cliente do controle, ou seja, o canto superior esquerdo do controle é 0, 0. O evento Paint e o método OnPaint para um ToolStripItem se comportam da mesma forma que outros eventos de pintura de controle.

Os controles ToolStrip também fornecem acesso mais refinado para a renderização de itens e contêiner por meio da classe ToolStripRenderer, que tem métodos substituíveis para pintar a tela de fundo, tela de fundo do item, imagem do item, seta do item, texto do item e borda do ToolStrip. Os argumentos de evento para esses métodos expõem várias propriedades, como retângulos, cores e formatos de texto que você pode ajustar conforme desejado.

Para ajustar apenas alguns aspectos de como um item é pintado, você normalmente substitui o ToolStripRenderer.

Se você estiver escrevendo um novo item e desejar controlar todos os aspectos de pintura, substitua o método OnPaint. De dentro de OnPaint, você pode usar métodos do ToolStripRenderer.

Por padrão, o ToolStrip é armazenado em buffer duplo, aproveitando a configuração de OptimizedDoubleBuffer.

Parenting

O conceito de posse e parentesco do contêiner é mais complexo em controles ToolStrip do que em outros controles de contêiner dos Windows Forms. Isso é necessário para dar suporte a cenários dinâmicos (como estouro, compartilhamento de itens de lista suspensa entre vários itens ToolStrip) e também para dar suporte à geração de um ContextMenuStrip de um controle.

A lista a seguir descreve os membros relacionados à parentalidade e explica seu uso.

  • OwnerItem acessa o item que é a origem do item do menu suspenso. Isso é semelhante a SourceControl, mas em vez de retornar um controle, ele retorna um ToolStripItem.

  • SourceControl determina qual controle é a origem do ContextMenuStrip quando vários controles compartilham o mesmo ContextMenuStrip.

  • GetCurrentParent é um acessador somente leitura para a propriedade Parent. Um pai é diferente de um proprietário no sentido de que um pai denota o ToolStrip atual retornado no qual o item é exibido, que pode estar na área de estouro.

  • Owner retorna o ToolStrip cuja coleção Items contém o ToolStripItem atual. Esta é a melhor maneira de referenciar ImageList ou outras propriedades no ToolStrip de nível mais alto sem escrever código especial para lidar com o transbordamento.

Comportamento de controles herdados

Os seguintes controles são bloqueados sempre que são usados na herança:

Por exemplo, crie um novo aplicativo do Windows Forms usando um ou mais dos controles na lista anterior. Defina o modificador de acesso de um ou mais controles para public ou protectede crie o projeto. Adicione um formulário que herda do primeiro formulário e selecione um controle herdado. O controle parece bloqueado, comportando-se como se seu modificador de acesso fosse private.

Suporte Herança de ToolStripContainer

O controle ToolStripContainer dá suporte a cenários herdados limitados, semelhantes ao exemplo a seguir:

  1. Crie um novo aplicativo do Windows Forms.

  2. Adicione um ToolStripContainer ao formulário.

  3. Defina o modificador de acesso do ToolStripContainer como public ou protected.

  4. Adicione qualquer combinação de controles ToolStrip, MenuStripe ContextMenuStrip às regiões ToolStripPanel do ToolStripContainer.

  5. Compile o projeto.

  6. Adicione um formulário que herda do primeiro formulário.

  7. Selecione o ToolStripContainer herdado no formulário.

Comportamento herdado de controles filho

Depois de concluir as etapas anteriores, o seguinte comportamento herdado ocorre:

  • No designer, o controle aparece com um ícone herdado.

  • Os controles ToolStripPanel estão bloqueados; você não pode selecionar ou reorganizar seu conteúdo.

  • Você pode adicionar controles ao ToolStripContentPanel, mover os controles e convertê-los em controles filho do ToolStripContentPanel.

  • Suas alterações persistem após a criação do formulário.

    Nota

    Remova os modificadores de acesso de todos os controles ToolStripPanel que fazem parte de um ToolStripContainer. O modificador de acesso do ToolStripContainer controla todo o controle.

Confiança Parcial

As limitações de ToolStripem ambiente de confiança parcial são projetadas para impedir o fornecimento inadvertido de informações pessoais que possam ser usadas por pessoas ou serviços não autorizados. As medidas de proteção são as seguintes:

  • Os controles ToolStripDropDown exigem AllWindows para exibir itens em um ToolStripControlHost. Isso se aplica a controles intrínsecos, como ToolStripTextBox, ToolStripComboBoxe ToolStripProgressBar, bem como a controles criados pelo usuário. Se esse requisito não for atendido, esses itens não serão exibidos. Nenhuma exceção é gerada.

  • A definição da propriedade AutoClose como false não é permitida e o parâmetro de evento Closing cancelável é ignorado. Isso torna impossível realizar mais de um pressionamento da tecla sem fechar o item suspenso. Se esse requisito não for atendido, esses itens não serão exibidos. Nenhuma exceção é gerada.

  • Muitos eventos de manipulação de pressionamento de tecla não serão gerados se ocorrerem em contextos de confiança parcial que não sejam AllWindows.

  • As chaves de acesso não são processadas quando AllWindows não é concedida.

Uso

Os seguintes padrões de uso têm uma influência no layout ToolStrip, na interação com o teclado e no comportamento do usuário final:

  • Juntou-se a um ToolStripPanel

    O ToolStrip pode ser reposicionado no ToolStripPanel e em ToolStripPanel. A propriedade Dock é ignorada e, se a propriedade Stretch for false, o tamanho da ToolStrip aumentará à medida que os itens são adicionados ao ToolStripPanel. Normalmente, o ToolStrip não participa da ordem de tabulação.

  • Encaixado

    O ToolStrip é colocado em um lado de um contêiner em uma posição fixa e o tamanho dele se expande sobre toda a borda na qual ele está ancorado. Normalmente, o ToolStrip não participa da ordem de tabulação.

  • Posição absoluta

    O ToolStrip é como outros controles, pois é posicionado pela propriedade Location, tem um tamanho fixo e normalmente participa da ordem de tabulação.

Interação com teclado

Chaves de acesso

Combinadas com ou seguindo a tecla ALT, as teclas de acesso são uma maneira de ativar um controle usando o teclado. ToolStrip dá suporte a chaves de acesso explícitas e implícitas. A definição explícita usa um caractere ampersand (&) anterior à letra. A definição implícita usa um algoritmo que tenta localizar um item correspondente com base na ordem dos caracteres em uma determinada propriedade Text.

Teclas de atalho

As teclas de atalho usadas por um MenuStrip usam uma combinação da enumeração Keys (que não segue uma ordem específica) para definir a chave de atalho. Você também pode usar a propriedade ShortcutKeyDisplayString para exibir apenas uma tecla de atalho com texto, como exibir "Del" em vez de "Excluir".

A chave ALT ativa o MenuStrip apontado por MainMenuStrip. A partir daí, CTRL+TAB navega entre controles de ToolStrip dentro de ToolStripPanels. A tecla TAB e as teclas de direção no teclado numérico navegarem entre itens em um ToolStrip. Um algoritmo especial manipula a navegação na região de transbordamento. A barra de espaços seleciona um ToolStripButton, ToolStripDropDownButton ou um ToolStripSplitButton.

Foco e validação

Quando ativado pela tecla ALT, o MenuStrip ou ToolStrip normalmente não tira nem remove o foco do controle que atualmente tem o foco. Se houver um controle hospedado no MenuStrip ou uma lista suspensa do MenuStrip, o controle ganhará foco quando o usuário pressionar a tecla TAB. Em geral, os eventos GotFocus, LostFocus, Enter e Leave de MenuStrip podem não ser gerados quando são ativados pelo teclado. Nesses casos, use em vez disso os eventos MenuActivate e MenuDeactivate.

Por padrão, CausesValidation é false. Chame Validate explicitamente em seu formulário para executar a validação.

Layout

Você controla o layout ToolStrip ao escolher um dos membros de ToolStripLayoutStyle com a propriedade LayoutStyle.

Layouts de pilha

Empilhamento é a organização de itens uns ao lado dos outros em ambas as extremidades do ToolStrip. A lista a seguir descreve os layouts de pilha.

Outros recursos de layouts de pilha

Alignment determina o final da ToolStrip à qual o item está alinhado.

Quando os itens não cabem no ToolStrip, um botão de transbordo é exibido automaticamente. A configuração da propriedade Overflow determina se um item aparece na área de transbordamento sempre, quando necessário, ou nunca.

No evento LayoutCompleted, você pode inspecionar a propriedade Placement para determinar se um item foi colocado na aba principal ToolStrip, na aba de estouro ToolStrip, ou se não está sendo exibido atualmente. Os motivos típicos pelos quais um item não é exibido são que o item não se encaixava no ToolStrip principal e sua propriedade Overflow foi definida como Never.

Torne um ToolStrip móvel colocando-o em um ToolStripPanel e definindo seu GripStyle para Visible.

Outras opções de layout

As outras opções de layout são Flow e Table.

Layout de fluxo

Flow layout é o padrão para ContextMenuStrip, ToolStripDropDownMenue ToolStripOverflow. É semelhante ao FlowLayoutPanel. Os recursos do layout de Flow são os seguintes:

Layout da tabela

Table layout é o padrão para StatusStrip. É semelhante a TableLayoutPanel. Os recursos do layout de Flow são os seguintes:

ToolStripItem

Os tópicos a seguir descrevem ToolStripItem e os controles que derivam dele.

ToolStripItem é a classe base abstrata para todos os itens que entram em um ToolStrip. O modelo de objeto a seguir mostra a hierarquia de herança ToolStripItem.

Diagrama que mostra o modelo de objeto ToolStripItem.

ToolStripItem classes herdam diretamente de ToolStripItemou herdam indiretamente de ToolStripItem através de ToolStripControlHost ou ToolStripDropDownItem.

ToolStripItem controles devem estar contidos em um ToolStrip, MenuStrip, StatusStripou ContextMenuStrip e não podem ser adicionados diretamente a um formulário. As várias classes de contêiner são projetadas para conter um subconjunto apropriado de controles de ToolStripItem.

A tabela a seguir lista os controles comuns de ToolStripItem e os contêineres no qual eles têm a melhor aparência. Embora qualquer item ToolStrip possa ser hospedado em qualquer contêiner derivado de ToolStrip, esses itens foram projetados para ter a melhor aparência nos seguintes contêineres:

Nota

ToolStripDropDown não aparece na caixa de ferramentas do designer.

Item contido ToolStrip MenuStrip ContextMenuStrip StatusStrip ToolStripDropDown
ToolStripButton Sim Não Não Não Sim
ToolStripComboBox Sim Sim Sim Não Sim
ToolStripSplitButton Sim Não Não Sim Sim
ToolStripLabel Sim Não Não Sim Sim
ToolStripSeparator Sim Sim Sim Não Sim
ToolStripDropDownButton Sim Não Não Sim Sim
ToolStripTextBox Sim Sim Sim Não Sim
ToolStripMenuItem Não Sim Sim Não Não
ToolStripStatusLabel Não Não Não Sim Não
ToolStripProgressBar Sim Não Não Sim Não
ToolStripControlHost Sim Sim Não Sim Sim

ToolStripButton

ToolStripButton é o item de botão para ToolStrip. Você pode exibi-lo com vários estilos de borda e usá-lo para representar e ativar estados operacionais. Você também pode defini-lo para ter o foco por padrão.

ToolStripLabel

O ToolStripLabel fornece funcionalidade de rótulo nos controles ToolStrip. O ToolStripLabel é como um ToolStripButton que não obtém foco por padrão e que não é renderizado como pressionado ou realçado.

ToolStripLabel, enquanto item hospedado, dá suporte a chaves de acesso.

Use as propriedades LinkColor, LinkVisitede LinkBehavior em um ToolStripLabel para dar suporte ao controle de link em um ToolStrip.

ToolStripStatusLabel

ToolStripStatusLabel é uma versão de ToolStripLabel projetada especificamente para uso em StatusStrip. Os recursos especiais incluem BorderStyle, BorderSides e Spring.

ToolStripSeparator

O ToolStripSeparator adiciona uma linha vertical ou horizontal a uma barra de ferramentas ou menu, dependendo da orientação. Ele fornece agrupamento ou distinção entre itens, como aqueles em um menu.

Você pode adicionar um ToolStripSeparator durante o design escolhendo-o em uma lista suspensa. No entanto, você também pode criar automaticamente um ToolStripSeparator digitando um hífen (-) no nó de modelo do designer ou no método Add.

ToolStripControlHost

ToolStripControlHost é a classe base abstrata para ToolStripComboBox, ToolStripTextBoxe ToolStripProgressBar. ToolStripControlHost pode hospedar outros controles, incluindo controles personalizados, de duas maneiras:

  • Construa um ToolStripControlHost com uma classe derivada de Control. Para acessar totalmente o controle hospedado e as propriedades, você deve converter a propriedade Control de volta para a classe real que ela representa.

  • Estenda ToolStripControlHoste, no construtor sem parâmetros da classe herdada, chame o construtor de classe base passando uma classe que deriva de Control. Essa opção permite que você encapsule métodos comuns de controle e propriedades para acesso fácil em um ToolStrip.

ToolStripComboBox

ToolStripComboBox é o ComboBox otimizado para hospedagem em um ToolStrip. Um subconjunto das propriedades e eventos do controle hospedado é exposto no nível ToolStripComboBox, mas o controle ComboBox subjacente é totalmente acessível por meio da propriedade ComboBox.

ToolStripTextBox

ToolStripTextBox é o TextBox otimizado para hospedagem em um ToolStrip. Um subconjunto das propriedades e eventos do controle hospedado é exposto no nível ToolStripTextBox, mas o controle subjacente TextBox é totalmente acessível por meio da propriedade TextBox.

ToolStripProgressBar

ToolStripProgressBar é o ProgressBar otimizado para hospedagem em um ToolStrip. Um subconjunto das propriedades e eventos do controle hospedado é exposto no nível ToolStripProgressBar, mas o controle ProgressBar subjacente é totalmente acessível por meio da propriedade ProgressBar.

ToolStripDropDownItem

ToolStripDropDownItem é a classe base abstrata para ToolStripMenuItem, ToolStripDropDownButtone ToolStripSplitButton, que pode hospedar itens diretamente ou hospedar itens adicionais em um contêiner suspenso. Você faz isso definindo a propriedade DropDown como um ToolStripDropDown e definindo a propriedade Items do ToolStripDropDown. Acesse esses itens suspensos diretamente por meio da propriedade DropDownItems.

ToolStripMenuItem

ToolStripMenuItem é um ToolStripDropDownItem que trabalha com ToolStripDropDownMenu e ContextMenuStrip para lidar com o realce especial, o layout e a disposição de colunas para menus.

ToolStripDropDownButton

ToolStripDropDownButton é similar a ToolStripButton, mas mostra uma área suspensa quando o usuário clica nele. Oculte ou mostre a seta suspensa definindo a propriedade ShowDropDownArrow. ToolStripDropDownButton hospeda um ToolStripOverflowButton que exibe itens que excedem o ToolStrip.

ToolStripSplitButton

ToolStripSplitButton combina a funcionalidade de botão e botão de menu.

Use a propriedade DefaultItem para sincronizar o evento Click do item selecionado no menu suspenso com o item exibido no botão.

Recursos genéricos do ToolStripItem

ToolStripItem fornece os seguintes recursos genéricos e opções para herdar controles:

  • Eventos principais

  • Manipulação de imagem

  • Alinhamento

  • Relação de texto e imagem

  • Estilo de exibição

Eventos principais

Controles ToolStripItem recebem seus próprios eventos de clique, mouse e pintura e podem executar também algum pré-processamento de teclado.

Manipulação de imagem

As propriedades Image, ImageAlign, ImageIndex, ImageKeye ImageScaling pertencem a vários aspectos do tratamento de imagem. Use imagens em controles ToolStrip definindo essas propriedades diretamente ou definindo a propriedade ImageList somente em tempo de execução.

O dimensionamento de imagem é determinado pela interação das propriedades em ToolStrip e ToolStripItem, da seguinte maneira:

Alinhamento

O valor da propriedade Alignment determina em qual extremidade da ToolStrip um item é exibido. A propriedade Alignment funciona somente quando o estilo de layout do ToolStrip é definido como um dos valores de excedente de pilha.

Os itens são colocados no ToolStrip na ordem em que aparecem na coleção de itens. Para alterar programaticamente onde um item é disposto, use o método Insert para mover o item na coleção. Esse método move o item, mas não o duplica.

Relação de texto e imagem

A propriedade TextImageRelation define o posicionamento relativo da imagem em relação ao texto em um ToolStripItem. Itens que não têm uma imagem, texto ou ambos são tratados como casos especiais para que o ToolStripItem não exiba um ponto em branco para o elemento ou elementos ausentes.

Estilo de Exibição

DisplayStyle permite definir os valores das propriedades Texto e Imagem de um item enquanto exibe apenas o que você deseja. Normalmente, isso é usado para alterar apenas o estilo de exibição ao mostrar o mesmo item em um contexto diferente.

Classes acessórias

As classes que fornecem várias outras funcionalidades incluem:

Consulte também