我需要为Windows窗体应用程序创建一个下拉菜单或组合框,其中包含一个小图像,然后是一个旁边的文本字符串。基本上,您可以将下拉列表中的每个“行”视为需要图标,然后是图标右侧的图标名称。我这样做有困难 - 实际上,我已经完全失败了。有谁知道完成这项任务的方法?任何帮助将不胜感激。谢谢!
答案 0 :(得分:21)
我能够提出一些非常简单的代码来执行此操作(请参阅下面的代码段)。代码创建一个控件,它是一个下拉控件,在同一行显示一个小的彩色方块和该颜色的名称(见照片)。感谢最初发布时为此提供的链接!希望这种控制可以在将来帮助其他人。
图片:强>
<强>代码:强>
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;
}
}
答案 1 :(得分:3)
非常有帮助.. 一些优化:
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;
}
}
答案 2 :(得分:1)
注意:此代码来自用户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)
{}
希望这有用:)
答案 3 :(得分:0)
我解决了这个问题,我这样做了:
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);
答案 4 :(得分:-6)
不确定图片,但这适用于字符串:
comboBox.Items.Add("String");