Arquitectura del control ToolStrip

Actualización: noviembre 2007

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

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 ToolStrip:

MenuStrip es el contenedor de nivel superior que reemplaza MainMenu. También proporciona características de control de claves y de la interfaz de múltiples documentos (MDI). Funcionalmente, ToolStripDropDownItem y ToolStripMenuItem cooperan 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. Puede mostrar mediante programación ContextMenuStrip por medio del método Show. ContextMenuStrip admite los eventos que se pueden cancelar Opening y Closing para controlar el llenado dinámico y los escenarios de varios clics. ContextMenuStrip admite imágenes, comprobación del estado 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. Igual que 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 para ToolStripItem se comportan como otros eventos de dibujo del control.

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 para estos métodos exponen varias propiedades, como rectángulos, colores y formatos de texto, que puede ajustar como desee.

Para ajustar solamente algunos aspectos de cómo se dibuja un elemento, normalmente se reemplaza ToolStripRenderer.

Si está escribiendo un elemento nuevo y desea controlar todos los aspectos del dibujo, reemplace el método OnPaint. Desde 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, genere 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. Genere 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 generar 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 ésta, 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."

Desplazamiento

La tecla ALT activa el MenuStrip al que señala MainMenuStrip. Desde allí, CTRL+TAB produce un desplazamiento entre los controles ToolStrip que se encuentren en los ToolStripPanel. La tecla TAB y las teclas de dirección del teclado numérico desplazan entre los elementos de ToolStrip. Un algoritmo especial controla la exploració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 alojado en MenuStrip o un control desplegable de MenuStrip, el control recibe 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 apilados

Apilar significa organizar los elementos contiguos entre sí en los dos extremos de ToolStrip. En la lista siguiente se describen los diseños apilados.

Otras características de los diseños apilados

Alignment determina el extremo de ToolStrip con el que se alinea el elemento.

Si los elementos no se ajustan dentro de ToolStrip, aparece automáticamente un botón de desbordamiento. El valor de las propiedades Overflow determina si aparece un elemento en el área de desbordamiento siempre, nunca o sólo cuando se necesita.

En el evento LayoutCompleted, puede inspeccionar la propiedad Placement para averiguar si un elemento se colocó en la ToolStrip principal, la ToolStrip de desbordamiento o si no se muestra en absoluto. La razón más habitual para que no se muestre un elemento es que el elemento no encajaba en la ToolStrip principal y su propiedad Overflow estaba establecida en Never.

Para hacer una ToolStrip que se pueda mover, colóquela en un ToolStripPanel y configure su GripStyle en Visible.

Otras opciones de diseño

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

Diseño Flow

El diseño Flow es el valor predeterminado para ContextMenuStrip, ToolStripDropDownMenu y ToolStripOverflow. Es similar a FlowLayoutPanel. Las características del diseño Flow son:

Diseño Table

El diseño Table es el valor predeterminado para StatusStrip. Es similar a TableLayoutPanel. Las características del diseño Flow son:

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

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

Los controles ToolStripItem deben estar en un control ToolStrip, MenuStrip, StatusStrip o ContextMenuStrip y no se pueden 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 alojarse 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 alojado, 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 seleccioná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 para ToolStripComboBox, ToolStripTextBox y ToolStripProgressBar. ToolStripControlHost puede alojar otros controles, incluidos los controles personalizados, de dos maneras:

  • Cree un ToolStripControlHost con una clase que deriva de Control. Para obtener acceso completamente al control alojado y las propiedades, debe volver a convertir la propiedad Control a la clase real que representa.

  • Extienda ToolStripControlHost, y en el constructor predeterminado de la clase heredada, llame al constructor de clase base que pasa una clase que deriva 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 alojamiento en ToolStrip. Un subconjunto de las propiedades y eventos del control alojado 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 alojamiento en ToolStrip. Un subconjunto de las propiedades y eventos del control alojado 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 alojamiento en ToolStrip. Un subconjunto de las propiedades y eventos del control alojado 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 alojar elementos directamente o alojar elementos adicionales en un contenedor desplegable. Para ello, establezca el valor de la propiedad DropDown en ToolStripDropDown y el valor de la propiedad Items de 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 de lista desplegable, establezca la propiedad ShowDropDownArrow. ToolStripDropDownButton aloja un ToolStripOverflowButton que muestra los elementos que producen el desbordamiento de 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 seleccionado 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. Para utilizar imágenes en los controles ToolStrip, establezca estas propiedades directamente o establezca la propiedad ImageList en tiempo de ejecución únicamente.

El ajuste de escala de la imagen viene determinado por la interacción de las propiedades de ToolStrip y ToolStripItem, como sigue:

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

Conceptos

Resumen de la tecnología ToolStrip

Referencia

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

Otros recursos

ToolStrip (Control de formularios Windows Forms)

MenuStrip (Control de formularios Windows Forms)

StatusStrip (Control)

ContextMenuStrip (Control)

BindingNavigator (Control, formularios Windows Forms)