Necesito crear un menú desplegable, o un cuadro combinado, para una aplicación de Windows Forms que contenga una imagen pequeña y luego una cadena de texto al lado. Básicamente, puede pensar en cada 'fila' en el menú desplegable como si necesitara tener un ícono y luego el nombre del ícono a la derecha del ícono. Tengo problemas para hacer esto; de hecho, no he tenido éxito. ¿Alguien sabe de una manera de lograr esta tarea? Cualquier ayuda será apreciada. ¡Gracias!Colocación de imágenes y cadenas con un cuadro combinado de C#
Respuesta
pude llegar a algún código muy sencillo de realizar esto (véase el siguiente fragmento de código) . El código crea un control que es un control desplegable que muestra un cuadrado pequeño de color y el nombre de ese color en la misma fila (ver foto). ¡Gracias por los enlaces proporcionados para esto cuando se publicó originalmente! Esperemos que este control pueda ayudar a alguien más en el futuro.
imagen:
Código:
class ColorSelector : ComboBox
{
public ColorSelector()
{
DrawMode = DrawMode.OwnerDrawFixed;
DropDownStyle = ComboBoxStyle.DropDownList;
}
// Draws the items into the ColorSelector object
protected override void OnDrawItem(DrawItemEventArgs e)
{
e.DrawBackground();
e.DrawFocusRectangle();
DropDownItem item = DropDownItem(Items[e.Index].ToString());
// Draw the colored 16 x 16 square
e.Graphics.DrawImage(item.Image, e.Bounds.Left, e.Bounds.Top);
// Draw the value (in this case, the color name)
e.Graphics.DrawString(item.Value, e.Font, new
SolidBrush(e.ForeColor), e.Bounds.Left + item.Image.Width, e.Bounds.Top + 2);
base.OnDrawItem(e);
}
}
public class DropDownItem
{
public string Value
{
get { return value; }
set { this.value = value; }
}
private string value;
public Image Image
{
get { return img; }
set { img = value; }
}
private Image img;
public DropDownItem() : this("")
{}
public DropDownItem(string val)
{
value = val;
this.img = new Bitmap(16, 16);
Graphics g = Graphics.FromImage(img);
Brush b = new SolidBrush(Color.FromName(val));
g.DrawRectangle(Pens.White, 0, 0, img.Width, img.Height);
g.FillRectangle(b, 1, 1, img.Width - 1, img.Height - 1);
}
public override string ToString()
{
return value;
}
}
Does this se adapte a sus necesidades
No estoy seguro acerca de las imágenes, pero esto debería funcionar para las cadenas:
comboBox.Items.Add("String");
Muy votos .. algunas optimizaciones:
public sealed class ColorSelector : ComboBox
{
public ColorSelector()
{
DrawMode = DrawMode.OwnerDrawFixed;
DropDownStyle = ComboBoxStyle.DropDownList;
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
e.DrawBackground();
e.DrawFocusRectangle();
if (e.Index >= 0 && e.Index < Items.Count)
{
DropDownItem item = (DropDownItem)Items[e.Index];
e.Graphics.DrawImage(item.Image, e.Bounds.Left, e.Bounds.Top);
e.Graphics.DrawString(item.Value, e.Font, new SolidBrush(e.ForeColor), e.Bounds.Left + item.Image.Width, e.Bounds.Top + 2);
}
base.OnDrawItem(e);
}
}
y ...
public sealed class DropDownItem
{
public string Value { get; set; }
public Image Image { get; set; }
public DropDownItem()
: this("")
{ }
public DropDownItem(string val)
{
Value = val;
Image = new Bitmap(16, 16);
using (Graphics g = Graphics.FromImage(Image))
{
using (Brush b = new SolidBrush(Color.FromName(val)))
{
g.DrawRectangle(Pens.White, 0, 0, Image.Width, Image.Height);
g.FillRectangle(b, 1, 1, Image.Width - 1, Image.Height - 1);
}
}
}
public override string ToString()
{
return Value;
}
}
NOTA: Este código es de optimización de usuario de Que dal Si usted desea tener una cadena que no es sólo el nombre del color, cambie DropDownItem tener 2 argumentos, la cuerda y el color, a continuación, sólo cambian la forma del pincel establece el color, tales como:
public DropDownItem(string val, Color color)
{
Value = val;
Image = new Bitmap(16, 16);
using (Graphics g = Graphics.FromImage(Image))
{
using (Brush b = new SolidBrush(color))
{
g.DrawRectangle(Pens.White, 0, 0, Image.Width, Image.Height);
g.FillRectangle(b, 1, 1, Image.Width - 1, Image.Height - 1);
}
}
}
A continuación, debe cambiar el elemento desplegable como tal:
public DropDownItem()
: this("", Color.Empty)
{}
la esperanza que esto era útil :)
he resuelto el problema, lo hice:
ComboBox MarcadorNS = new ComboBox(); MarcadorNS.Height = 30; MarcadorNS.Width = 150; MarcadorNS.SelectedValuePath = "Uid"; foreach (var temporalItem in GetPredefinedKinds()) { Image ImagenCombo = new Image(); ImagenCombo.Source = new BitmapImage(new Uri( "Imagenes/Marcadores/" + temporalItem.Name.ToLower() + ".png", UriKind.Absolute)); ImagenCombo.Height = 28; ImagenCombo.Width = 28; ImagenCombo.VerticalAlignment = VerticalAlignment.Top; ImagenCombo.HorizontalAlignment = HorizontalAlignment.Left; Label textoCombo = new Label(); textoCombo.VerticalAlignment = VerticalAlignment.Top; textoCombo.HorizontalAlignment = HorizontalAlignment.Left; textoCombo.Content = BaseDatos.NombresDeMarcadores(temporalItem.ToString()); Grid GridCombo = new Grid(); GridCombo.Uid = ObtenerMarcador(temporalItem.ToString()); StackPanel stackCombo = new StackPanel(); stackCombo.Orientation = Orientation.Horizontal; stackCombo.Children.Add(ImagenCombo); stackCombo.Children.Add(textoCombo); GridCombo.Children.Add(stackCombo); MarcadorNS.Items.Add(GridCombo);
Es mejor intentar y explicar lo que está haciendo su código que simplemente arrojarlo en una respuesta; otras personas que leen la pregunta lo encontrarán más útil en ese momento. Realmente, la pregunta original no es buena ya que no muestra ningún intento de investigación. –
Código completamente incompleto ... – Joster
- 1. C# - Completar un cuadro combinado con una DataTable
- 2. combinado cuadro de autocompletar
- 3. Utilizar la lista de cadenas como fuente del cuadro combinado
- 4. Cuadro combinado de WinForms con varias columnas (C#)?
- 5. Formato de texto para un cuadro combinado, C#
- 6. valor seleccionado de un cuadro combinado
- 7. cursor escribir de cuadro combinado
- 8. Aspecto del cuadro combinado
- 9. Lista desplegable de cuadro combinado
- 10. ¿Mejor cuadro combinado de Javascript?
- 11. Encuadernación convertida Enum a un cuadro combinado
- 12. ¿Cómo rellenar el cuadro combinado de formularios de C# windows?
- 13. Obtener el texto seleccionado de un cuadro combinado usando jQuery, por nombre del cuadro combinado?
- 14. WPF valor de cuadro combinado y visualización de texto
- 15. Eventos del cuadro combinado VB6
- 16. Evento de celda del cuadro combinado DataGridView en C#
- 17. Desactivar elementos particulares en un cuadro combinado
- 18. ¿Acceso directo al cuadro combinado DataGridView con un solo clic?
- 19. Agregar enum al cuadro combinado
- 20. Tkinter - Cómo crear un cuadro combinado con autocompletado
- 21. Delphi: ¿Es posible tener un cuadro combinado con elementos desactivados?
- 22. caso cuadro combinado desplegable sensibles
- 23. Seleccionar el valor de cuadro combinado con jQuery
- 24. Vinculación de cuadro combinado (jQuery preferiblemente)
- 25. VB.NET - Función de búsqueda usando Textbox y cuadro combinado
- 26. texto 'por defecto' de cuadro combinado con plantilla
- 27. cuadro combinado de la unión a otro cuadro combinado en WPF
- 28. Implementar el cuadro combinado de varias columnas con HTML + JavaScript
- 29. ExtJs 4 cuadro combinado con casillas de verificación
- 30. Cómo permitir que un usuario escriba en un cuadro combinado
Si el cuadro combinado no siempre tiene una selección, a continuación, necesita envolver su código de dibujo en 'if (e.Index> = 0) {...}'. –