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.
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
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:
ToolStripPanel que inclui os painéis em um ToolStripContainer e também os controles individuais de ToolStripPanel.
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 protected
e 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:
Crie um novo aplicativo do Windows Forms.
Adicione um ToolStripContainer ao formulário.
Defina o modificador de acesso do ToolStripContainer como
public
ouprotected
.Adicione qualquer combinação de controles ToolStrip, MenuStripe ContextMenuStrip às regiões ToolStripPanel do ToolStripContainer.
Compile o projeto.
Adicione um formulário que herda do primeiro formulário.
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 ToolStrip
em 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 forfalse
, 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".
Navegação
A chave ALT ativa o MenuStrip apontado por MainMenuStrip. A partir daí, CTRL+TAB navega entre controles de ToolStrip dentro de ToolStripPanel
s. 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.
StackWithOverflow é o padrão. Essa configuração faz com que o ToolStrip altere o próprio layout automaticamente de acordo com a propriedade Orientation para lidar com cenários de arrastar e encaixar.
VerticalStackWithOverflow renderiza os itens de ToolStrip um ao lado do outro verticalmente.
HorizontalStackWithOverflow renderiza os itens ToolStrip ao lado uns dos outros horizontalmente.
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:
Todas as funcionalidades de FlowLayoutPanel são expostas pela propriedade LayoutSettings. Você deve converter a classe LayoutSettings em uma classe FlowLayoutSettings.
Você pode usar as propriedades Dock e Anchor no código para alinhar os itens dentro da linha.
A propriedade Alignment é ignorada.
No evento LayoutCompleted, você pode inspecionar a propriedade Placement para determinar se um item foi colocado no ToolStrip principal ou não se encaixou.
A aderência não é renderizada e, portanto, um ToolStrip no estilo de layout Flow em um ToolStripPanel não pode ser movido.
O botão de transbordamento ToolStrip não é renderizado, e Overflow é ignorado.
Layout da tabela
Table layout é o padrão para StatusStrip. É semelhante a TableLayoutPanel. Os recursos do layout de Flow são os seguintes:
Todas as funcionalidades de TableLayoutPanel são expostas pela propriedade LayoutSettings. Você deve converter a classe LayoutSettings em uma classe TableLayoutSettings.
Você pode usar as propriedades Dock e Anchor no código para alinhar os itens dentro da célula da tabela.
A propriedade Alignment é ignorada.
No evento LayoutCompleted, você pode inspecionar a propriedade Placement para determinar se um item foi colocado no ToolStrip principal ou não se encaixou.
A aderência não é renderizada e, portanto, um ToolStrip no estilo de layout Table em um ToolStripPanel não pode ser movido.
O botão de overflow ToolStrip não é renderizado e Overflow é ignorado.
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.
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:
ImageScalingSize é a escala da imagem final, conforme determinado pela combinação da configuração de ImageScaling da imagem e a configuração de AutoSize do contêiner.
Se AutoSize for
true
(o padrão) e ToolStripItemImageScaling for SizeToFit, nenhum dimensionamento de imagem ocorrerá e o tamanho ToolStrip será o do maior item ou um tamanho mínimo prescrito.Se AutoSize for
false
e ToolStripItemImageScaling for None, não ocorrerá nem o dimensionamento da imagem nem o dimensionamento de ToolStrip.
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:
ToolStripManager dá suporte a tarefas relacionadas a ToolStrippara aplicativos inteiros, como mesclagem, configurações e opções de renderização.
ToolStripRenderer permite que você aplique um estilo ou tema específico a um ToolStrip facilmente.
ToolStripProfessionalRenderer cria canetas e pincéis com base em uma tabela de cores substituível (ProfessionalColorTable).
ToolStripSystemRenderer aplica cores do sistema e um estilo visual simples para ToolStrip aplicativos.
ToolStripContainer é semelhante a SplitContainer. Ele usa quatro painéis laterais encaixados (instâncias de ToolStripPanel) e um painel central (uma instância de ToolStripContentPanel) para criar uma disposição típica. Você não pode remover os painéis laterais, mas pode ocultá-los. Você não pode remover nem ocultar o painel central. Você pode organizar um ou mais controles ToolStrip, MenuStripou StatusStrip nos painéis laterais e usar o painel central para outros controles. O ToolStripContentPanel também fornece uma maneira de obter o suporte do renderizador no corpo do seu formulário para uma aparência consistente. ToolStripContainer não dá suporte a MDI (interface de vários documentos).
ToolStripPanel fornece espaço para mover e organizar os controles do ToolStrip. Você só poderá usar um painel se desejar e ToolStripPanel funciona bem em cenários de MDI.
Consulte também
.NET Desktop feedback