Arquitectura del control ToolStrip

Las clases ToolStrip y ToolStripItem proporcionan un sistema flexible y extensible para mostrar elementos de menú, estado y barras de herramientas. Estas clases están todas en el espacio de nombres System.Windows.Forms y su nombre lleva normalmente el prefijo "ToolStrip" (como ToolStripOverflow) o el sufijo "Strip" (como MenuStrip).

ToolStrip

En los temas siguientes se explican la clase ToolStrip y los controles que derivan de ella.

ToolStrip es la clase base abstracta de MenuStrip, StatusStrip y ContextMenuStrip. El modelo de objetos siguiente muestra la jerarquía de herencia de ToolStrip.

Modelo de objetos ToolStrip

Modelo de objeto ToolStrip

Se puede obtener acceso a todos los elementos de ToolStrip a través de la colección Items. Se puede obtener acceso a todos los elementos de un control ToolStripDropDownItem a través de la colección DropDownItems. En una clase derivada de ToolStrip, también puede utilizar la propiedad DisplayedItems para obtener sólo acceso a los elementos que se muestran actualmente. Éstos son los elementos que no están actualmente en un menú de desbordamiento.

Los elementos siguientes están diseñados específicamente para trabajar sin problemas con ToolStripSystemRenderer y ToolStripProfessionalRenderer en todas las orientaciones. Están disponibles de forma predeterminada en tiempo de diseño para el control ToolStrip:

MenuStrip es el contenedor de nivel superior que reemplaza a MainMenu. También proporciona las características de control de claves y de interfaz de múltiples documentos (MDI). Funcionalmente, ToolStripDropDownItem y ToolStripMenuItem operan junto con MenuStrip, aunque se derivan de ToolStripItem.

Los elementos siguientes están diseñados específicamente para trabajar sin problemas con ToolStripSystemRenderer y ToolStripProfessionalRenderer en todas las orientaciones. Están disponibles de forma predeterminada en tiempo de diseño para el control MenuStrip:

StatusStrip

StatusStrip reemplaza el control StatusBar. Las características especiales de StatusStrip incluyen un diseño de tabla personalizada, compatibilidad con controles de cambio de tamaño y desplazamiento de formularios y la propiedad Spring, que permite que ToolStripStatusLabel rellene automáticamente el espacio disponible.

Los elementos siguientes están diseñados específicamente para trabajar sin problemas con ToolStripSystemRenderer y ToolStripProfessionalRenderer en todas las orientaciones. Están disponibles de forma predeterminada en tiempo de diseño para el control StatusStrip:

ContextMenuStrip

ContextMenuStrip reemplaza ContextMenu. Puede asociar ContextMenuStrip a cualquier control, y un clic con el botón secundario del mouse muestra automáticamente el menú contextual. También es posible mostrar un objeto ContextMenuStrip mediante programación utilizando el método Show. ContextMenuStrip admite eventos Closing y Opening, que se pueden cancelar, para controlar escenarios de relleno dinámico y uso de varios clic. ContextMenuStrip admite imágenes, el estado de activación de elementos de menú, texto, teclas de acceso, accesos directos y menús en cascada.

Los elementos siguientes están diseñados específicamente para trabajar sin problemas con ToolStripSystemRenderer y ToolStripProfessionalRenderer en todas las orientaciones. Están disponibles de forma predeterminada en tiempo de diseño para el control ContextMenuStrip:

Características genéricas de ToolStrip

En los temas siguientes se describen las características y el comportamiento que son genéricos de ToolStrip y los controles derivados.

Dibujo

Puede dibujar de forma personalizada en los controles ToolStrip de varias maneras. Como ocurre con otros controles de formularios Windows Forms, tanto ToolStrip como ToolStripItem tienen métodos OnPaint y eventos Paint que se pueden reemplazar. Como con el dibujo normal, el sistema de coordenadas es relativo al área de cliente del control; es decir, la esquina superior izquierda del control es 0, 0. El evento Paint y el método OnPaint de un control ToolStripItem se comportan como otros eventos de dibujo de controles.

Los controles ToolStrip también proporcionan un acceso más preciso a la representación de los elementos y el contenedor, por medio de la clase ToolStripRenderer, que tiene métodos reemplazables para dibujar el fondo, el fondo del elemento, la imagen del elemento, la flecha del elemento, el texto del elemento y el borde de ToolStrip. Los argumentos de evento de estos métodos exponen varias propiedades como rectángulos, colores y formatos de texto que puede ajustar como desee.

Para ajustar sólo algunos aspectos de cómo se dibuja un elemento, normalmente se reemplaza la clase ToolStripRenderer.

Si escribe un nuevo elemento y desea controlar todos los aspectos del dibujo, reemplace el método OnPaint. Desde el interior de OnPaint, puede utilizar los métodos de ToolStripRenderer.

De forma predeterminada, ToolStrip tiene un búfer doble y saca partido de la configuración de OptimizedDoubleBuffer.

Relación jerárquica

El concepto de propiedad de los contenedores y relación jerárquica es más complicado en los controles ToolStrip que en otros controles de contenedor de formularios Windows Forms. Esto es necesario para la compatibilidad con escenarios dinámicos como el desbordamiento, para compartir elementos desplegables entre varios elementos de ToolStrip y para admitir la generación de ContextMenuStrip desde un control.

En la lista siguiente se describen los miembros relacionados con la relación jerárquica y se explica su uso.

  • OwnerItem obtiene acceso al elemento que es el origen del elemento desplegable. Es similar a SourceControl, pero en lugar de devolver un control, devuelve ToolStripItem.

  • SourceControl determina qué control es el origen de ContextMenuStrip cuando varios controles comparten la misma ContextMenuStrip.

  • GetCurrentParent es un descriptor de acceso de sólo lectura para la propiedad Parent. Un elemento primario difiere de un propietario en que el elemento primario denota la ToolStrip actual devuelta en la que se muestra el elemento, que podría estar en el área de desbordamiento.

  • Owner devuelve la ToolStrip cuya colección Items contiene la ToolStripItem actual. Ésta es la mejor manera de hacer referencia a ImageList o a otras propiedades en la ToolStrip de nivel superior sin escribir un código especial para controlar el desbordamiento.

Comportamiento de los controles heredados

Los controles siguientes se bloquean cada vez que se utilizan en herencia:

Por ejemplo, cree una aplicación nueva de formularios Windows Forms que use uno o más de los controles de la lista anterior. Establezca el modificador de acceso de uno o varios controles en public o protected y, a continuación, compile el proyecto. Agregue un formulario que herede del primer formulario y, a continuación, seleccione un control heredado. El control aparece bloqueado y se comporta como si su modificador de acceso fuera private.

Compatibilidad de ToolStripContainer con la herencia

El control ToolStripContainer admite escenarios heredados limitados, como en el ejemplo siguiente:

  1. Cree una nueva aplicación para formularios Windows Forms.

  2. Agregue un control ToolStripContainer al formulario.

  3. Establezca el modificador de acceso de ToolStripContainer en public o protected.

  4. Agregue una combinación de los controles ToolStrip, MenuStrip y ContextMenuStrip a las regiones ToolStripPanel de ToolStripContainer.

  5. Compile el proyecto.

  6. Agregue un formulario que herede del primer formulario.

  7. Seleccione el ToolStripContainer heredado en el formulario.

Comportamiento heredado de los controles secundarios

Después de finalizar los pasos anteriores, el comportamiento heredado es el siguiente:

  • En el diseñador, el control aparece con un icono heredado.

  • Se bloquean los controles ToolStripPanel; no puede seleccionar ni reorganizar su contenido.

  • Puede agregar controles a ToolStripContentPanel, mover los controles y convertirlos en controles secundarios de ToolStripContentPanel.

  • Los cambios que efectúe permanecerán después de compilar el formulario.

    Nota

    Quite los modificadores de acceso de todos los controles ToolStripPanel que formen parte de un ToolStripContainer. El modificador de acceso de ToolStripContainer gobierna el control entero.

Confianza parcial

Las limitaciones de ToolStrip bajo confianza parcial están diseñadas para evitar la entrada inadvertida de datos personales que puedan ser utilizados por personas o servicios sin autorización. Las medidas de protección son las siguientes:

  • Los controles ToolStripDropDown requieren que AllWindows muestre los elementos en un ToolStripControlHost. Esto es aplicable tanto a los controles intrínsecos, por ejemplo, ToolStripTextBox, ToolStripComboBox y ToolStripProgressBar, como a los controles creados por el usuario. Si no se cumple este requisito, no se muestran estos elementos. No se produce ninguna excepción.

  • No se puede establecer la propiedad AutoClose en false y el parámetro de evento cancelable Closing se omite. A causa de esto, no es posible presionar más de una tecla sin que se cierre el elemento desplegable. Si no se cumple este requisito, no se muestran estos elementos. No se produce ninguna excepción.

  • No se provocan muchos eventos de control de pulsación de tecla si se producen en contextos de confianza parcial distintos de AllWindows.

  • Las teclas de acceso no se procesan si no se dispone del permiso AllWindows.

Uso

Los modelos de uso siguientes inciden en el diseño de ToolStrip, la interacción con el teclado y el comportamiento de usuario final:

  • Se une en un ToolStripPanel

    ToolStrip se puede cambiar de posición en ToolStripPanel y en los controles ToolStripPanel. La propiedad Dock se omite y, si la propiedad Stretch es false, el tamaño de ToolStrip aumenta cuando se agregan elementos a ToolStripPanel. Normalmente, ToolStrip no participa en el orden de tabulación.

  • Acoplado

    ToolStrip se coloca en un lado de un contenedor en una posición fija y su tamaño se expande sobre el borde completo en el que se acopla. Normalmente, ToolStrip no participa en el orden de tabulación.

  • En posición absoluta

    ToolStrip se parece a otros controles, en cuanto que lo coloca la propiedad Location, tiene un tamaño fijo y normalmente participa en el orden de tabulación.

Interacción del teclado

Teclas de acceso

Las teclas de acceso, presionadas a la vez que la tecla ALT o después de esta, ofrecen una manera de activar un control mediante el teclado. ToolStrip admite las teclas de acceso explícitas e implícitas. La definición explícita utiliza un carácter & (Y comercial) que precede a la letra. La definición implícita utiliza un algoritmo que intenta encontrar un elemento correspondiente basándose en el orden de los caracteres en una propiedad Text determinada.

Teclas de método abreviado

Las teclas de método abreviado utilizadas por una clase MenuStrip definen la tecla de método abreviado mediante una combinación de la enumeración Keys (sin orden específico). También puede utilizar la propiedad ShortcutKeyDisplayString para mostrar una tecla de método abreviado con sólo texto, por ejemplo, mostrar "Supr" en lugar de "Suprimir."

La tecla ALT activa el MenuStrip al que señala MainMenuStrip. Desde allí, CTRL+TAB navega entre los controles ToolStrip que se encuentren en los ToolStripPanel. La tecla TAB y las teclas de dirección del teclado numérico permiten navegar entre los elementos de ToolStrip. Un algoritmo especial controla la navegación en el área de desbordamiento. La BARRA ESPACIADORA selecciona un control ToolStripButton, ToolStripDropDownButton o ToolStripSplitButton.

Foco y validación

Cuando la tecla ALT los activa, MenuStrip o ToolStrip normalmente no quitan ni ponen el foco en el control que esté seleccionado. Si hay un control hospedado en el contenedor de objetos MenuStrip o un control desplegable del objeto MenuStrip, el control obtiene el foco cuando el usuario presiona la tecla TAB. En general, puede que los eventos GotFocus, LostFocus, Enter y Leave de MenuStrip no se generen si se activan con el teclado. En tales casos, utilice en su lugar los eventos MenuActivate y MenuDeactivate.

De manera predeterminada, CausesValidation es false. Llame explícitamente a Validate en el formulario para realizar la validación.

Diseño

Puede controlar el diseño de ToolStrip eligiendo uno de los miembros de ToolStripLayoutStyle con la propiedad LayoutStyle.

Diseños de pila

El apilamiento consiste en la disposición de los elementos uno al lado de otro a ambos extremos del contenedor de objetos ToolStrip. La lista siguiente describe los diseños de pila.

Otras características de los diseños de pila

Alignment determina el fin del contenedor ToolStrip con el que se alinea el elemento.

Cuando los productos no caben en el contenedor ToolStrip, aparece automáticamente un botón de desbordamiento. El valor de la propiedad Overflow determina si un elemento aparecerá siempre en el área de desbordamiento, cuando sea necesario, o nunca.

En el evento LayoutCompleted, puede inspeccionar la propiedad Placement para determinar si un elemento se ha colocado en el contenedor ToolStrip principal, en el contenedor ToolStrip de desbordamiento, o si actualmente no se muestra en absoluto. Las razones típicas de que un elemento no se muestre son que el elemento no quepa en el ToolStrip principal y que su propiedad Overflow esté establecida en Never.

Haga que un objeto ToolStrip sea movible colocándolo en un contenedor ToolStripPanel y establezca su propiedad GripStyle en Visible.

Otras opciones de diseño

Las otras opciones de diseño son Flow y Table.

Diseño de flujo

El diseño de Flow es el valor predeterminado de los controles ContextMenuStrip, ToolStripDropDownMenu y ToolStripOverflow. Es similar al panel FlowLayoutPanel. A continuación se detallan las características del diseño de Flow:

Diseño de tabla

El diseño de Table es el valor predeterminado de StatusStrip. Es similar a TableLayoutPanel. A continuación se detallan las características del diseño de Flow:

ToolStripItem

En los temas siguientes se explican la clase ToolStripItem y los controles que derivan de ella.

ToolStripItem es la clase base abstracta para todos los elementos que entran en ToolStrip. El modelo de objetos siguiente muestra la jerarquía de herencia de ToolStripItem.

Modelo de objetos ToolStripItem

Modelo de objeto ToolStripItem

Las clases ToolStripItem heredan directamente de ToolStripItem o indirectamente de ToolStripItem a través de ToolStripControlHost o ToolStripDropDownItem.

Los controles ToolStripItem se deben contener en ToolStrip, MenuStrip, StatusStrip o ContextMenuStrip y no se deben agregar directamente a un formulario. Las diversas clases de contenedor están diseñadas para contener un subconjunto adecuado de controles ToolStripItem.

La tabla siguiente muestra los controles ToolStripItem estándar y los contenedores en los que se ven mejor. Si bien cualquier elemento de ToolStrip puede hospedarse en un contenedor derivado de ToolStrip, estos elementos se ven mejor en los contenedores siguientes:

Nota

ToolStripDropDown no aparece en el cuadro de herramientas de diseñador.

Elemento que contiene

ToolStrip

MenuStrip

ContextMenuStrip

StatusStrip

ToolStripDropDown

ToolStripButton

No

No

No

ToolStripComboBox

No

ToolStripSplitButton

No

No

ToolStripLabel

No

No

ToolStripSeparator

No

ToolStripDropDownButton

No

No

ToolStripTextBox

No

ToolStripMenuItem

No

No

No

ToolStripStatusLabel

No

No

No

No

ToolStripProgressBar

No

No

No

ToolStripControlHost

No

ToolStripButton

ToolStripButton es el elemento de botón para ToolStrip. Puede mostrarlo con varios estilos de borde y puede utilizarlo para representar y activar estados operacionales. También puede definirlo para que obtenga el foco de forma predeterminada.

ToolStripLabel

ToolStripLabel proporciona la funcionalidad de las etiquetas en los controles ToolStrip. ToolStripLabel es parecido a un ToolStripButton que no recibe el foco de forma predeterminada y que no se representa como presionado ni resaltado.

ToolStripLabel, como elemento hospedado, admite las teclas de acceso.

Use las propiedades LinkColor, LinkVisited y LinkBehavior de ToolStripLabel para admitir el control de vinculación en un ToolStrip.

ToolStripStatusLabel

ToolStripStatusLabel es una versión de ToolStripLabel diseñada específicamente para el uso en StatusStrip. Entre sus características especiales destacan BorderStyle, BorderSides y Spring.

ToolStripSeparator

ToolStripSeparator agrega una línea vertical u horizontal a una barra de herramientas o de menú, dependiendo de la orientación. Proporciona un medio para agrupar o distinguir elementos, como los de un menú.

Puede agregar un ToolStripSeparator en tiempo de diseño eligiéndolo en una lista desplegable. También puede crear automáticamente un ToolStripSeparator escribiendo un guión (-) en el nodo de plantilla de diseñador o en el método Add.

ToolStripControlHost

ToolStripControlHost es la clase base abstracta de ToolStripComboBox, ToolStripTextBox y ToolStripProgressBar. ToolStripControlHost puede hospedar otros controles, incluso controles personalizados, de dos maneras:

  • Construir un ToolStripControlHost con una clase que derive de Control. Para tener acceso total al control y las propiedades hospedados, debe volver a convertir la propiedad Control en la clase real que representa.

  • Extender ToolStripControlHost y, en el constructor predeterminado de la clase heredada, llamar al constructor de clase base pasando una clase que derive de Control. Esta opción permite ajustar los métodos de control comunes y propiedades para obtener fácilmente acceso en un control ToolStrip.

ToolStripComboBox

ToolStripComboBox es el ComboBox optimizado para el hospedaje en ToolStrip. Un subconjunto de las propiedades y eventos del control hospedado se expone en el nivel ToolStripComboBox, pero el control ComboBox subyacente es totalmente accesible por medio de la propiedad ComboBox.

ToolStripTextBox

ToolStripTextBox es el TextBox optimizado para el hospedaje en ToolStrip. Un subconjunto de las propiedades y eventos del control hospedado se expone en el nivel ToolStripTextBox, pero el control TextBox subyacente es totalmente accesible por medio de la propiedad TextBox.

ToolStripProgressBar

ToolStripProgressBar es el ProgressBar optimizado para el hospedaje en ToolStrip. Un subconjunto de las propiedades y eventos del control hospedado se expone en el nivel ToolStripProgressBar, pero el control ProgressBar subyacente es totalmente accesible por medio de la propiedad ProgressBar.

ToolStripDropDownItem

ToolStripDropDownItem es la clase base abstracta para ToolStripMenuItem, ToolStripDropDownButton y ToolStripSplitButton, que puede hospedar elementos directamente u hospedar elementos adicionales en un contenedor desplegable. Para ello, establezca la propiedad DropDown en un ToolStripDropDown y establezca la propiedad Items del ToolStripDropDown. Puede obtener acceso directamente a estos elementos desplegables por medio de la propiedad DropDownItems.

ToolStripMenuItem

ToolStripMenuItem es un ToolStripDropDownItem que, junto con ToolStripDropDownMenu y ContextMenuStrip, permite controlar el resaltado especial, el diseño y la organización en columnas de los menús.

ToolStripDropDownButton

ToolStripDropDownButton se parece a ToolStripButton, pero muestra un área desplegable cuando el usuario hace clic en él. Para ocultar o mostrar la flecha desplegable, establezca la propiedad ShowDropDownArrow. ToolStripDropDownButton hospeda un ToolStripOverflowButton que muestra los elementos que desbordan ToolStrip.

ToolStripSplitButton

ToolStripSplitButton combina las funcionalidades de botón y de botón de lista desplegable.

La propiedad DefaultItem permite sincronizar el evento Click del elemento desplegable elegido con el elemento mostrado en el botón.

Características genéricas de ToolStripItem

ToolStripItem proporciona las opciones y las características genéricas siguientes a los controles que se heredan:

  • Eventos básicos

  • Control de la imagen

  • Alineación

  • Relación entre texto e imagen

  • Estilo de presentación

Eventos básicos

Los controles ToolStripItem reciben eventos propios de clic, mouse y dibujo, y también pueden realizar el preprocesamiento de teclado.

Control de la imagen

Las propiedades Image, ImageAlign, ImageIndex, ImageKey y ImageScaling corresponden a varios aspectos del control de la imagen. Utilice imágenes en los controles ToolStrip estableciendo estas propiedades directamente o la propiedad ImageList únicamente en tiempo de ejecución.

El ajuste de escala de imágenes está determinado por la interacción de propiedades en ToolStrip y en ToolStripItem, del siguiente modo:

Alineación

El valor de la propiedad Alignment determina el extremo de ToolStrip en el que aparece un elemento. La propiedad Alignment sólo funciona cuando el estilo de diseño de ToolStrip está establecido en uno de los valores de desbordamiento de pila.

Los elementos se colocan en ToolStrip en el orden en el que aparecen en la colección Items. Para cambiar mediante programación la ubicación donde se dispone un elemento, utilice el método Insert para mover el elemento en la colección. Este método mueve el elemento pero no lo duplica.

Relación entre texto e imagen

La propiedad TextImageRelation define la posición relativa de la imagen con respecto al texto en un ToolStripItem. Los elementos que carecen de imagen, texto o ambos se tratan como casos especiales para que ToolStripItem no muestre una zona vacía para el elemento o elementos que faltan.

Estilo de presentación

DisplayStyle permite establecer los valores de las propiedades Text e Image de un elemento para que sólo muestren lo que se desee. Por lo general, esto se utiliza para cambiar solamente el estilo de presentación cuando el mismo elemento se muestra en un contexto diferente.

Clases de accesorios

Las clases que proporcionan otras funcionalidades incluyen:

Vea también

Referencia

Información sobre el control ToolStrip (formularios Windows Forms)

Conceptos

Resumen de la tecnología ToolStrip

Otros recursos

ToolStrip (Control de formularios Windows Forms)

MenuStrip (Control de formularios Windows Forms)

StatusStrip (Control)

ContextMenuStrip (Control)

BindingNavigator (Control, formularios Windows Forms)