2009-03-24 2 views
4

У меня есть несколько изображений с некоторым текстом, мне нужно показать изображение с соответствующим текстом в списке.Добавить изображение в список

просмотра Google я наткнулся на этот класс образца,

public class Customer 
{ 

    public string Fname; 

    public string Lname; 

public Customer(string firstName, string lastName) 
{ 
    Fname = firstName; 
    Lname = lastName; 
} 

public override string ToString() 
{ 
    return Fname + " " + Lname; 
} 
} 

lstCustomers.Items.Add(new Customer("Foo","Bar")); 

Приведенный выше код работает отлично, как это только возвращает строку, как я могу вернуть изображение и строку, вместе с тем, что она добавляется в ListBox?

С наилучшими пожеланиями

@nand

+0

Похоже, вы имеете в виду WPF? Или WinForms? –

+0

Я бы предложил добавить соответствующий тег для уточнения. –

ответ

7

Просто используйте DataTemplate для отображения своих объектов в ListBox.

Создайте объект данных, содержащий строковые свойства и свойство изображения:

public class Img 
{ 
    public Img(string value, Image img) { Str = value; Image = img; } 
    public string Str { get; set; } 
    public Image Image { get; set; } 
} 

Создать DataTemplate для отображения этого:

<ListBox x:Name="lstBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate DataType="{x:Type local:Img}"> 
      <StackPanel> 
       <TextBlock Margin="3" Text="{Binding Str}"/> 
       <ContentControl Margin="3" Content="{Binding Image}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Теперь добавьте Img элементы (или объекты данных) в ListBox примерно так:

lstBox.Items.Add(new Img("Value", myImage)); 
+0

Предполагает, что вы используете WPF ... –

+0

Это также работает для winforms, не уверен в том, что в datatemplate и как создать это на форме? Спасибо. – flavour404

+0

Нет, это не работает для Windows Forms. В Window Forms нет DataTemplates или XAML. Для Windows Forms вам, вероятно, потребуется написать собственный код для создания элементов управления для ваших элементов данных. –

3

Вы не можете (без взлома вокруг) поместить изображения в ListBoxes.

Вы можете поместить их в ListViews.

Вам необходимо поместить изображения в компонент ImageList, а затем привязать ImageList к списку. Конечно, вы можете инкапсулировать свое изображение в свой класс, добавив свойство Image и добавив его в коллекцию ImageList.Items.

Затем для каждого списка ListViewItem в списке установите свойство ImageIndex в индекс изображения в списке.

Все это можно сделать с помощью конструктора.

0

В ответе на вопрос Аббасся - , но я получил сообщение об ошибке «локальный» является необъявленной Namespace

относит:

«местное» пространство имен добавить окна тега.

<Window x:Class="MyApp.MyWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MyWindow" Height="400" Width="600" 
    xmlns:local="clr-namespace:MyApp"> 
+0

Я получаю сообщение «Ошибка 1» Имя «Img» не существует в пространстве имен «ThisusAndTheMinotaur» об этой строке ''. Но я включил класс Img в пространство имен TheusAndTheMinotaur. – user2602079

1

первый положить в ValueMemeber собственности Image (здесь есть строковое свойство тоже) и DrawMode в OwnerDrawVariable и переопределить DrawItem

listbox1.DrawItem += new DrawItemEventHandler(listbox1_DrawItem); 
listbox1.ItemHeight = 16; 

private void listbox1_DrawItem(object sender, DrawItemEventArgs e) 
     { 
e.DrawBackground(); 
     e.DrawFocusRectangle(); 
     Rectangle bounds = e.Bounds; 
     Size imageSize = new Size(16, 16); 
     Bitmap b; 
     StringFormat sf = new StringFormat(); 
     sf.Alignment = StringAlignment.Far; 
     Rectangle rc = new Rectangle(e.Bounds.X + 1, e.Bounds.Y + 1, e.Bounds.Width - 5, e.Bounds.Height - 3); 
     UseObject s ; 
     if (e.Index >= 0) 
     { 
      s = (UseObject)listbox1.Items[e.Index]; 

      b = new Bitmap(s.Img, imageSize); 
      e.Graphics.DrawImage(b, e.Bounds.X, e.Bounds.Y); 
      e.Graphics.DrawString(s.Str, new Font("Verdana", 10, FontStyle.Bold), new SolidBrush(Color.Black), rc, sf); 
     } 
     } 
Смежные вопросы