¿Cómo se puede crear un control C# Winforms que salga de los límites de su región? Como un cuadro desplegable. Algo así como si tuviera un DropDownBox en un Panel de Tamaño Pequeño.Cómo crear un control de Winforms C# que se cierne
Respuesta
Hice algo similar a eso recientemente, y utilicé un ListBox. Lo bueno de un cuadro de lista es que puedes mostrarlo donde quieras, incluso fuera de los límites de tu control. De esta forma, cuando detecte mediante un clic de un botón o lo que sea, que necesita mostrar el DropDown que desea, simplemente llene el ListBox y muéstrelo en cualquier lugar que desee. Tengo la idea de aquí:
http://msdn.microsoft.com/en-us/library/aa480727.aspx
Ellos muestran cómo construir un DataGridView personalizado con el filtrado, y para visualizar los valores de filtro, se coloca un cuadro de lista debajo de la celda de cabecera.
Windows Forms no es compatible con windows así, es básicamente incompatible con el diseñador. Aquí hay un código para comenzar. No puede usar este control en el diseñador, debe crearse en tiempo de ejecución. También debe llamar a su método Dispose() usted mismo.
using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
public class MyListBox : ListBox {
private Control mParent;
private Point mPos;
private bool mInitialized;
public MyListBox(Control parent) {
mParent = parent;
mInitialized = true;
this.SetTopLevel(true);
parent.LocationChanged += new EventHandler(parent_LocationChanged);
mPos = mParent.Location;
}
public new Point Location {
get { return mParent.PointToClient(this.Location); }
set {
Point zero = mParent.PointToScreen(Point.Empty);
base.Location = new Point(zero.X + value.X, zero.Y + value.Y);
}
}
protected override Size DefaultSize {
get {
return mInitialized ? base.DefaultSize : Size.Empty;
}
}
protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) {
if (this.mInitialized)
base.SetBoundsCore(x, y, width, height, specified);
}
void parent_LocationChanged(object sender, EventArgs e) {
base.Location = new Point(base.Left + mParent.Left - mPos.X, base.Top + mParent.Top - mPos.Y);
mPos = mParent.Location;
}
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
if (mParent != null && !DesignMode) {
cp.Style = (int)(((long)cp.Style & 0xffff) | 0x90200000);
cp.Parent = mParent.Handle;
Point pos = mParent.PointToScreen(Point.Empty);
cp.X = pos.X;
cp.Y = pos.Y;
cp.Width = base.DefaultSize.Width;
cp.Height = base.DefaultSize.Height;
}
return cp;
}
}
}
Hay un buen artículo aquí:
http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/article.asp
Esto tiene una clase que se ocupa de algunos de los aspectos difíciles de conseguir que esto funcione correctamente, tales como el mantenimiento de la barra de título de ventana de la aplicación activa , manejando Alt-Tab y cancelando con un clic del mouse.
- 1. menú de jquery que se cierne
- 2. ¿Es esto un control? (C# Winforms)
- 3. ¿C WinForms tiene un control deslizante?
- 4. C# WinForms propiedades predeterminadas de control personalizado
- 5. Cómo crear un hilo en WinForms?
- 6. WinForms - ¿Cómo se obtiene el tamaño que un Control "quiere" ser?
- 7. Usando un control WPF personalizado en WinForms
- 8. Necesito un .NET WinForms IP Address Control
- 9. Control vs UserControl en WinForms?
- 10. Cómo establecer el orden Z de un control usando WinForms
- 11. WPF lanzando una excepción que analiza XAML que incluye un control de usuario de Winforms
- 12. Control de cmd.exe desde Winforms
- 13. ToggleButton in C# WinForms
- 14. cómo poner un control extendido WinForms en caja de herramientas
- 15. ¿Puedo crear un control ActiveX desde un UserControl de WPF y utilizarlo en una aplicación que no sea CLI C++?
- 16. ¿Cómo puedo saber a qué pestaña se desplaza de/a en un control de pestaña WinForms?
- 17. ¿Cómo puedo hacer que una barra de progreso de winforms se mueva verticalmente en C#?
- 18. ¿Cómo puedo crear configuraciones editables en una aplicación C# WinForms?
- 19. Agregue una columna de hipervínculo para un control Winforms DataGrid
- 20. Aplicación de consola C#: ¿Impide que se imprima Control-C?
- 21. Cómo crear Combobox en winforms readonly
- 22. Hace un control de Winforms generar un evento cuando se agrega a un formulario
- 23. Crear WinForms ComboBox con elementos no seleccionables
- 24. IE8, Flash y WinForms WebBrowser Control
- 25. WinForms Volume Slider/Trackbar User Control
- 26. C# winforms: graphics.DrawImage problema
- 27. Mostrando una sugerencia para un control de edición de C# winforms
- 28. Cómo crear una DLL que se usará en C#
- 29. C# WinForms Problema del panel
- 30. ¿Cómo se evita que se repita al crear un registrador?
Lo intenté y funciona muy bien, pero de alguna manera no genera eventos ListBox como DrawItem y SelectedIndexChanged. ¿Tienes alguna idea de por qué? –
Vea mi respuesta aquí: http://stackoverflow.com/questions/398176/listbox-with-overriden-createparams-doesnt-raise-item-events#398694 –