使用C#Combobox放置图像和字符串

我需要为Windows窗体应用程序创建一个下拉菜单或combobox,其中包含一个小图像,然后是一个旁边的文本字符串。 基本上,您可以将下拉列表中的每个“行”视为需要图标,然后是图标右侧的图标名称。 我在做这件事时遇到了麻烦 – 实际上,我已经完全失败了。 有谁知道完成这项任务的方法? 任何帮助将不胜感激。 谢谢!

我能够提出一些非常简单的代码来执行此操作(请参阅下面的代码段)。 该代码创建一个控件,该控件是一个下拉控件,在同一行中显示一个小的彩色方块和该颜色的名称(见照片)。 感谢最初发布时为此提供的链接! 希望这种控制可以在将来帮助其他人。

图片:

下拉颜色选择器


码:

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

这是否适合您的需求

非常有帮助..一些优化:

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

和......

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

注意:此代码来自用户que dal的优化如果您希望有一个不仅仅是颜色名称的字符串,请将DropDownItem更改为包含2个参数,字符串和颜色,然后只需更改画笔设置颜色的方式, 因此:

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

然后,您必须更改下拉项目:

  public DropDownItem() : this("", Color.Empty) {} 

希望这有用:)

我解决了这个问题,我这样做了:

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

结果

不确定图像,但这应该适用于字符串:

 comboBox.Items.Add("String");