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
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:
ToolStripPanel que incluye los paneles de un ToolStripContainer y también los controles ToolStripPanel individuales.
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:
Cree una nueva aplicación para formularios Windows Forms.
Agregue un control ToolStripContainer al formulario.
Establezca el modificador de acceso de ToolStripContainer en public o protected.
Agregue una combinación de los controles ToolStrip, MenuStrip y ContextMenuStrip a las regiones ToolStripPanel de ToolStripContainer.
Genere el proyecto.
Agregue un formulario que herede del primer formulario.
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.
StackWithOverflow es el valor predeterminado. Esta configuración hace que ToolStrip modifique automáticamente su diseño en función de la propiedad Orientation para controlar los escenarios de arrastre y acoplamiento.
VerticalStackWithOverflow representa los elementos ToolStrip contiguos entre sí en dirección vertical.
HorizontalStackWithOverflow representa los elementos ToolStrip contiguos entre sí en dirección horizontal.
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:
La propiedad LayoutSettings expone todas las características de FlowLayoutPanel. Debe convertir la clase LayoutSettings en una clase FlowLayoutSettings.
Puede utilizar Dock y las propiedades Anchor en el código para alinear los elementos dentro de la fila.
La propiedad Alignment se omite.
En el evento LayoutCompleted, puede inspeccionar la propiedad Placement para determinar si se colocó un elemento en la ToolStrip principal o el elemento no se ajustaba.
El control de ajuste no está representado y, por consiguiente, no se puede desplazar una ToolStrip en el estilo de diseño Flow de un ToolStripPanel.
El botón de desbordamiento ToolStrip no está representado y Overflow se omite.
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:
La propiedad LayoutSettings expone todas las características de TableLayoutPanel. Debe convertir la clase LayoutSettings en una clase TableLayoutSettings.
Puede utilizar Dock y las propiedades Anchor en el código para alinear los elementos dentro de la celda de la tabla.
La propiedad Alignment se omite.
En el evento LayoutCompleted, puede inspeccionar la propiedad Placement para determinar si se colocó un elemento en la ToolStrip principal o el elemento no se ajustaba.
El control de ajuste no está representado y, por consiguiente, no se puede desplazar una ToolStrip en el estilo de diseño Table de un ToolStripPanel.
El botón de desbordamiento ToolStrip no está representado y Overflow se omite.
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 |
---|---|---|---|---|---|
Sí |
No |
No |
No |
Sí |
|
Sí |
Sí |
Sí |
No |
Sí |
|
Sí |
No |
No |
Sí |
Sí |
|
Sí |
No |
No |
Sí |
Sí |
|
Sí |
Sí |
Sí |
No |
Sí |
|
Sí |
No |
No |
Sí |
Sí |
|
Sí |
Sí |
Sí |
No |
Sí |
|
No |
Sí |
Sí |
No |
No |
|
No |
No |
No |
Sí |
No |
|
Sí |
No |
No |
Sí |
No |
|
Sí |
Sí |
No |
Sí |
Sí |
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:
ImageScalingSize es la escala de la imagen final, determinada por la combinación de la configuración de ImageScaling de la imagen y la configuración de AutoSize del contenedor.
Si AutoSize es true (el valor predeterminado) y ToolStripItemImageScaling es SizeToFit, no se ajusta la escala de la imagen y el tamaño de ToolStrip es el del elemento más grande o un tamaño mínimo indicado.
Si AutoSize es false y ToolStripItemImageScaling es None, no se ajusta la escala de la imagen ni de ToolStrip.
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:
ToolStripManager admite tareas relacionadas con ToolStrip para aplicaciones completas, como combinación, configuración y opciones de representación.
ToolStripRenderer permite aplicar con facilidad un estilo o tema determinado a ToolStrip.
ToolStripProfessionalRenderer crea los lápices y pinceles basándose en una tabla de colores reemplazable (ProfessionalColorTable).
ToolStripSystemRenderer aplica colores de sistema y un estilo visual plano a las aplicaciones ToolStrip.
ToolStripContainer es similar a SplitContainer. Utiliza cuatro paneles laterales acoplados (instancias de ToolStripPanel) y un panel central (una instancia de ToolStripContentPanel) para crear una organización habitual. No se pueden quitar los paneles laterales, pero se pueden ocultar. No se puede quitar ni ocultar el panel central. Puede disponer uno o varios controles ToolStrip, MenuStrip o StatusStrip en los paneles laterales y utilizar el panel central para otros controles. ToolStripContentPanel también proporciona una manera de obtener compatibilidad de representación en el cuerpo de un formulario para darle un aspecto coherente. ToolStripContainer no admite la interfaz de múltiples documentos (MDI).
ToolStripPanel proporciona el espacio para desplazar y organizar los controles ToolStrip. Puede utilizar sólo un panel si lo desea y ToolStripPanel es apropiada para los escenarios de MDI.
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)