Размещение изображений и строк с помощью C # Combobox - PullRequest
14 голосов
/ 02 ноября 2010

Мне нужно создать выпадающее меню или выпадающий список для приложения Windows Forms, которое содержит небольшое изображение, а затем строку текста рядом с ним. По сути, вы можете думать о каждой «строке» в раскрывающемся меню, как о необходимости иметь значок, а затем имя значка справа от значка. У меня проблемы с этим - на самом деле, я был совершенно неудачным. Кто-нибудь знает способ выполнения этой задачи? Любая помощь будет оценена. Спасибо!

Ответы [ 5 ]

21 голосов
/ 14 марта 2012

Мне удалось придумать очень простой код для выполнения этого (см. Фрагмент ниже). Код создает элемент управления, который является выпадающим элементом управления, который показывает маленький цветной квадрат и имя этого цвета в той же строке (см. Фото). Спасибо за ссылки, предоставленные для этого назад, когда он был первоначально размещен! Надеемся, что этот контроль может помочь кому-то еще в будущем.

Изображение:

Drop Down Color Selector


Код:

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 голосов
/ 14 ноября 2012

Очень полезно .. некоторые оптимизации:

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;
    }
}
1 голос
/ 05 марта 2013

ПРИМЕЧАНИЕ. Этот код взят из оптимизации пользователя. Если вы хотите, чтобы строка представляла собой не просто имя цвета, измените 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)
    {}

Надеюсь, это было полезно:)

0 голосов
/ 30 марта 2016

Я решил проблему, я сделал это:

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

Результат

0 голосов
/ 02 ноября 2010

Не уверен насчет изображений, но это должно работать для строк:

comboBox.Items.Add("String");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...