Arquitectura del control ToolStrip

Las clases ToolStrip y ToolStripItem proporcionan un sistema flexible y extensible para mostrar elementos de barra de herramientas, estado y menú. Todas estas clases están incluidas en el espacio de nombres System.Windows.Forms y suelen denominarse con el prefijo "ToolStrip" (como ToolStripOverflow) o con el sufijo "Strip" (como MenuStrip).

ToolStrip

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

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

Diagrama que muestra el modelo de objetos ToolStrip.

Puede tener acceso a todos los elementos de una clase ToolStrip a través de la colección Items. Puede tener acceso a todos los elementos de una clase ToolStripDropDownItem a través de la colección DropDownItems. En una clase derivada de ToolStrip, también puede usar la propiedad DisplayedItems para acceder solo a los elementos que se muestran actualmente. Se trata de los elementos que no están actualmente en un menú de desbordamiento.

Los siguientes elementos están diseñados expresamente para funcionar a la perfección con ToolStripSystemRenderer y con 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 características clave de control y de interfaz de múltiples documentos (MDI). Desde el plano funcional, ToolStripDropDownItem y ToolStripMenuItem funcionan con MenuStrip, aunque deriven de ToolStripItem.

Los siguientes elementos están diseñados expresamente para funcionar a la perfección con ToolStripSystemRenderer y con ToolStripProfessionalRenderer en todas las orientaciones. Están disponibles de forma predeterminada en tiempo de diseño para el control MenuStrip:

StatusStrip

StatusStrip reemplaza al control StatusBar. Las características especiales de StatusStrip incluyen un diseño de tabla personalizado, compatibilidad con el ajuste de tamaño y con el desplazamiento de los controles de ajuste del formulario y la propiedad Spring, que permite que un elemento ToolStripStatusLabel rellene el espacio disponible automáticamente.

Los siguientes elementos están diseñados expresamente para funcionar a la perfección con ToolStripSystemRenderer y con ToolStripProfessionalRenderer en todas las orientaciones. Están disponibles de forma predeterminada en tiempo de diseño para el control StatusStrip:

ContextMenuStrip

ContextMenuStrip reemplaza a ContextMenu. Puede asociar un elemento ContextMenuStrip a cualquier control, y un clic con el botón derecho del mouse abre automáticamente el menú contextual. Puede mostrar un objeto ContextMenuStrip mediante programación usando el método Show. ContextMenuStrip admite los eventos cancelables Opening y Closing para controlar el relleno dinámico y los escenarios de varios clics. ContextMenuStrip admite imágenes, estados de comprobación de elementos de menú, texto, teclas de acceso, accesos directos y menús en cascada.

Los siguientes elementos están diseñados expresamente para funcionar a la perfección con ToolStripSystemRenderer y con 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 genéricos de ToolStrip y de sus controles derivados.

Representación

Hay varias formas de realizar representaciones personalizadas en controles ToolStrip. Como sucede con otros controles de Windows Forms, tanto ToolStrip como ToolStripItem tienen métodos OnPaint y eventos Paint que se pueden invalidar. Al igual que con la representación al uso, el sistema de coordenadas es relativo al área cliente del control; es decir, la esquina superior izquierda del control es 0, 0. El evento Paint y el método OnPaint de un elemento ToolStripItem se comportan como otros eventos de representación de controles.

Los controles ToolStrip también proporcionan un mejor acceso a la representación de los elementos y el contenedor a través de la clase ToolStripRenderer, que tiene métodos que se pueden invalidar para representar el fondo, el fondo del elemento, la imagen del elemento, la flecha de 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 se pueden ajustar según sea necesario.

Para ajustar solo algunos aspectos de cómo se representa un elemento, normalmente lo que se hace es invalidar ToolStripRenderer.

Si va a escribir un elemento nuevo y desea controlar todos los aspectos de representación, invalide el método OnPaint. En OnPaint se pueden usar métodos de ToolStripRenderer.

ToolStrip se almacena doblemente en búfer de forma predeterminada, con lo cual se saca partido de la configuración OptimizedDoubleBuffer.

Relación jerárquica

El concepto de propiedad y relación jerárquica de los contenedores es más complejo en los controles ToolStrip que en otros controles de contenedor de Windows Forms. Esto es necesario para admitir escenarios dinámicos (como el desbordamiento o el uso compartido de elementos desplegables en varios elementos ToolStrip), así como para permitir la generación de un elemento ContextMenuStrip a partir de un control.

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

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

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

  • GetCurrentParent es un descriptor de acceso de solo lectura a la propiedad Parent. Un elemento principal difiere de un propietario en que el primero denota el elemento ToolStrip actual devuelto donde se muestra el elemento, que podría estar en el área de desbordamiento.

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

Comportamiento de los controles heredados

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

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

Compatibilidad de herencia de ToolStripContainer

El control ToolStripContainer admite escenarios heredados limitados, similar al ejemplo siguiente:

  1. Cree una nueva aplicación Windows Forms.

  2. Agregue un control ToolStripContainer al formulario.

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

  4. Agregue cualquier combinación de 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 objeto ToolStripContainer heredado en el formulario.

Comportamiento heredado de los controles secundarios

Después de completar los pasos anteriores, se produce el siguiente comportamiento heredado:

  • En el Diseñador, el control aparece con un icono que señala que es heredado.

  • Los controles ToolStripPanel están bloqueados; su contenido no se puede seleccionar ni reorganizar.

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

  • Los cambios se conservarán después de compilar el formulario.

    Nota

    Quite los modificadores de acceso de todos los controles ToolStripPanel que formen parte de ToolStripContainer. El modificador de acceso de ToolStripContainer rige al control completo.

Confianza parcial

Las limitaciones de los objetos ToolStrip en situaciones de confianza parcial están pensadas para evitar la entrada involuntaria de información personal que podría ser utilizada por personas o servicios no autorizados. Estas son las medidas de protección:

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

  • La propiedad AutoClose no se puede establecer en false y se omite el parámetro de evento Closing cancelable. Esto hace que sea imposible escribir más de una pulsación de tecla sin descartar el elemento desplegable. Si este requisito no se cumple, estos elementos no se muestran. No se inicia ninguna excepción.

  • Muchos eventos de control de pulsaciones de tecla no se generarán si se producen en contextos de confianza parciales distintos de AllWindows.

  • Las teclas de acceso no se procesan si AllWindows no se ha concedido.

Uso

Los siguientes patrones de uso guardan relación con el diseño de ToolStrip, la interacción del teclado y el comportamiento del usuario final:

  • Unido a un objeto ToolStripPanel

    ToolStrip se puede cambiar de posición tanto dentro de ToolStripPanel como entre varios ToolStripPanel. La propiedad Dock se omite, y si la propiedad Stretch es false, el tamaño de ToolStrip crece a medida que se van agregando elementos a ToolStripPanel. Normalmente, ToolStrip no suele participar en el orden de las pestañas.

  • Acoplado

    ToolStrip se coloca a un lado de un contenedor en una posición fija, y su tamaño se expande sobre todo el borde al que está acoplado. Normalmente, ToolStrip no suele participar en el orden de las pestañas.

  • Situado en posición absoluta

    ToolStrip es como otros controles, en el sentido de que se coloca mediante la propiedad Location, tiene un tamaño fijo y normalmente participa en el orden de las pestañas.

Interacción con el teclado

Claves de acceso

Presionadas al mismo tiempo o después de la tecla ALT, las teclas de acceso son una manera de activar un control mediante el teclado. ToolStrip admite teclas de acceso explícitas e implícitas. La definición explícita usa un carácter de Y comercial (&) que precede a la letra. La definición implícita usa un algoritmo que intenta buscar un elemento coincidente en función del orden de los caracteres de una propiedad Text determinada.

Teclas de método abreviado

Las teclas de método abreviado que usa MenuStrip emplean una combinación de la enumeración Keys (que no es específica del orden) para definir la tecla de método abreviado. También se puede usar la propiedad ShortcutKeyDisplayString para mostrar una tecla de método abreviado solo con texto, por ejemplo, mostrar "Supr" en lugar de "Suprimir".

La tecla ALT activa el objeto MenuStrip al que MainMenuStrip apunta. Dicho esto, CTRL + TAB permite desplazarse entre los controles ToolStrip de varios objetos ToolStripPanel. La tecla TAB y las teclas de dirección del teclado numérico permiten desplazarse entre los elementos de un objeto ToolStrip. Un algoritmo especial controla la navegación en la región de desbordamiento. La barra espaciadora permite seleccionar un objeto ToolStripButton, ToolStripDropDownButton o ToolStripSplitButton.

Foco y validación

Cuando se activa mediante la tecla ALT, normalmenteMenuStripni ToolStrip obtienen ni quitan el foco del control que lo tenga actualmente. Si hay un control hospedado en MenuStrip o una lista desplegable de MenuStrip, el control obtiene el foco cuando el usuario presiona la tecla TAB. En general, los eventos GotFocus, LostFocus, Enter y Leave de MenuStrip pueden no generarse cuando se activan a través del teclado. En tales casos, use en su lugar los eventos MenuActivate y MenuDeactivate.

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

Layout

Para controlar el diseño de ToolStrip, elija uno de los miembros de ToolStripLayoutStyle con la propiedad LayoutStyle.

Diseños de pila

El apilamiento consiste en organizar elementos de manera adyacente en ambos extremos del objeto ToolStrip. En la lista siguiente se describen los diseños de pila.

Otras características de los diseños de pila

Alignment determina el final del objeto ToolStrip al que el elemento está alineado.

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

En el evento LayoutCompleted, puede inspeccionar la propiedad Placement para determinar si un elemento se colocó en el elemento ToolStrip principal, en el desbordamiento ToolStrip o si no se muestra en absoluto. Los motivos típicos por los que un elemento no aparece son que el elemento no cabe en el elemento principal ToolStrip y su propiedad Overflow se estableció en Never.

Haga que un objeto ToolStrip sea móvil; para ello, colóquelo en un elemento ToolStripPanel y establezca su valor de 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 Flow es el valor predeterminado de ContextMenuStrip, ToolStripDropDownMenu y ToolStripOverflow. Es similar a FlowLayoutPanel. Las características del diseño Flow son las siguientes:

Diseño de tabla

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

ToolStripItem

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

ToolStripItem es la clase base abstracta de todos los elementos que se incluyen en un elemento ToolStrip. En el siguiente modelo de objetos se muestra la jerarquía de herencia de ToolStripItem.

Diagrama que muestra el modelo de objetos ToolStripItem.

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

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

En la tabla siguiente se enumeran los controles ToolStripItem estándar y los contenedores en los que mejor encajan visualmente. Aunque cualquier elemento ToolStrip se puede hospedar en cualquier contenedor derivado de ToolStrip, estos elementos se diseñaron para que se vean mejor en los siguientes contenedores:

Nota

ToolStripDropDown no se muestra en el cuadro de herramientas del Diseñador.

Elemento contenido ToolStrip MenuStrip ContextMenuStrip StatusStrip ToolStripDropDown
ToolStripButton No N.º No
ToolStripComboBox No
ToolStripSplitButton No No
ToolStripLabel No No
ToolStripSeparator No
ToolStripDropDownButton No No
ToolStripTextBox No
ToolStripMenuItem No No N.º
ToolStripStatusLabel N.º N.º No No
ToolStripProgressBar No No No
ToolStripControlHost No

ToolStripButton

ToolStripButton es el elemento de botón de ToolStrip. Se puede mostrar con varios estilos de borde, y se puede usar para representar y activar estados operativos. También se puede definir para que tenga el foco de forma predeterminada.

ToolStripLabel

ToolStripLabel proporciona la funcionalidad de etiqueta en los controles ToolStrip. ToolStripLabel es como un elemento ToolStripButton que no obtiene el foco de forma predeterminada y que no se representa como presionado o resaltado.

ToolStripLabel como elemento hospedado admite teclas de acceso.

Use las propiedades LinkColor, LinkVisited y LinkBehavior en un elemento ToolStripLabel para admitir el control de vínculo en un elemento ToolStrip.

ToolStripStatusLabel

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

ToolStripSeparator

ToolStripSeparator agrega una línea vertical u horizontal a una barra de herramientas o a un menú, dependiendo de la orientación. Proporciona la capacidad de agrupación de elementos (como los de un menú) o de distinción entre ellos.

Puede agregar un elemento ToolStripSeparator en tiempo de diseño seleccionándolo de una lista desplegable. Con todo, también puede crear automáticamente un elemento ToolStripSeparator escribiendo un guión (-) en el nodo de plantilla del 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 (incluidos controles personalizados) de dos maneras:

  • Cree un objeto ToolStripControlHost con una clase que derive de Control. Para tener acceso completo al control hospedado y a las propiedades, debe volver a convertir la propiedad Control a la clase real que representa.

  • Extienda ToolStripControlHost y, en el constructor sin parámetros de la clase heredada, llame al constructor de clase base pasando una clase que deriva de Control. Esta opción permite encapsular propiedades y métodos de control comunes para facilitar el acceso en un objeto ToolStrip.

ToolStripComboBox

ToolStripComboBox es el objeto ComboBox optimizado para hospedar en un objeto ToolStrip. Un subconjunto de las propiedades y eventos del control hospedado se exponen en el nivel de ToolStripComboBox, pero el control ComboBox subyacente es totalmente accesible a través de la propiedad ComboBox.

ToolStripTextBox

ToolStripTextBox es el objeto TextBox optimizado para hospedar en un objeto ToolStrip. Un subconjunto de las propiedades y eventos del control hospedado se exponen en el nivel de ToolStripTextBox, pero el control TextBox subyacente es totalmente accesible a través de la propiedad TextBox.

ToolStripProgressBar

ToolStripProgressBar es el objeto ProgressBar optimizado para hospedar en un objeto ToolStrip. Un subconjunto de las propiedades y eventos del control hospedado se exponen en el nivel de ToolStripProgressBar, pero el control ProgressBar subyacente es totalmente accesible a través de la propiedad ProgressBar.

ToolStripDropDownItem

ToolStripDropDownItem es la clase base abstracta para ToolStripMenuItem, ToolStripDropDownButton y ToolStripSplitButton, que puede hospedar elementos directamente u hospedar más elementos en un contenedor desplegable. Para ello, establezca la propiedad DropDown en un objeto ToolStripDropDown y la propiedad Items de ToolStripDropDown Acceda a estos elementos desplegables directamente a través de la propiedad DropDownItems.

ToolStripMenuItem

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

ToolStripDropDownButton

ToolStripDropDownButton se parece a ToolStripButton, pero muestra un área desplegable cuando el usuario hace clic en él. Oculte o muestre la flecha desplegable estableciendo la propiedad ShowDropDownArrow. ToolStripDropDownButton hospeda un control ToolStripOverflowButton que muestra los elementos que desbordan el objeto ToolStrip.

ToolStripSplitButton

ToolStripSplitButton combina la funcionalidad de botón y de botón desplegable.

Use la propiedad DefaultItem para sincronizar el evento Click del elemento desplegable seleccionado con el elemento que se muestra en el botón.

Características genéricas de ToolStripItem

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

  • Eventos principales

  • Control de imágenes

  • Alineación

  • Relación entre texto e imagen

  • Estilo de presentación

Eventos principales

Los controles ToolStripItem reciben sus propios eventos de clic, mouse y representación, y también pueden realizar algún preprocesamiento de teclado.

Control de imágenes

Las propiedades Image, ImageAlign, ImageIndex, ImageKey y ImageScaling tienen que ver con diversos aspectos del control de imágenes. Para usar imágenes en controles ToolStrip, establezca estas propiedades directamente o establezca la propiedad ImageList de solo tiempo de ejecución.

El escalado de imágenes viene determinado por la interacción de las propiedades tanto en ToolStrip como en ToolStripItem, como se indica a continuación:

Alineación

El valor de la propiedad Alignment determina el final del objeto ToolStrip en el que un elemento aparece. La propiedad Alignment solo 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 el objeto ToolStrip en el orden en que los elementos aparecen en la colección Items. Para cambiar mediante programación dónde se coloca un elemento, use el método Insert para mover el elemento de la colección. Este método mueve el elemento, pero no lo duplica.

Relación entre texto e imagen

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

Estilo de presentación

DisplayStyle permite establecer los valores de las propiedades Text e Image de un elemento mientras se muestra solo lo que desea. Normalmente se usa para cambiar solamente el estilo de presentación cuando el mismo elemento se muestra en un contexto diferente.

Clases accesorias

Entre las clases que proporcionan otras funcionalidades se incluyen las siguientes:

Consulte también