2010-11-02 7 views
11

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

18

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:

Drop Down Color Selector


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; 
    } 
} 
+3

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) {...}'. –

-6

No estoy seguro acerca de las imágenes, pero esto debería funcionar para las cadenas:

comboBox.Items.Add("String"); 
3

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; 
    } 
} 
1

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

0

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);

Result

+0

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. –

+0

Código completamente incompleto ... – Joster

Cuestiones relacionadas