WPF - ListBox显示任意内容

原创 2013年03月02日 11:58:13

WFP是非常强大的。ListBox是一个很常用的控件,看了一下它的items属性,定义如下:

public ItemCollection Items { get; }

这是一个collection,我没有仔细研究ItemCollection类,我只看了一下ItemCollection的一个成员函数Add,定义如下:

public int Add(object newItem);

哈哈,它的参数是object类型,那么也就是说可以存放任何对象。

这么说来ListBox里面的items可以是任何对象,这样我们就可以在item里面显示任何我们想要的效果。

 

XAML静态显示ListBox

先来看看XAML里面如何显示一个listbox。随便写了个例子,如下:

        <ListBox Margin="15,12,0,0" Name="listBox1" Height="121" HorizontalAlignment="Left" VerticalAlignment="Top" Width="129">
            <ListBoxItem Background="Blue">item1</ListBoxItem>
            <ListBoxItem>
                <StackPanel Orientation="Horizontal">
                    <Ellipse Fill="Yellow" Height="50" Width="50"></Ellipse>
                    <Label>abcd</Label>
                </StackPanel>
            </ListBoxItem>
            <ListBoxItem>
                <StackPanel Orientation="Vertical">
                    <Rectangle Fill="Red" Height="50" Width="100"></Rectangle>
                    <TextBox>hello</TextBox>
                </StackPanel>
            </ListBoxItem>
        </ListBox>

放了3个item,注意每个item只能有一个child,如果我们把StackPanel去掉,那么就会报错。如:

error MC3089: The object 'ListBoxItem' already has a child and cannot add 'TextBox'. 'ListBoxItem' can accept only one child. Line 17 Position 30.

所以,当item里面需要显示多个控件的时候,就需要StackPanel或者其他类似的一个容器。


C#动态设置item

通常,listbox的内容是动态生成的,那么我们可以使用C#来设置内容,比如:

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            TextBox text = new TextBox();
            text.Text = "hello world";

            Ellipse ellipse = new Ellipse();
            ellipse.Height = 50;
            ellipse.Width = 50;
            ellipse.Fill = new SolidColorBrush(Color.FromRgb(255, 0, 0));
           

            StackPanel panel = new StackPanel();
            panel.Orientation = Orientation.Horizontal;

            panel.Children.Add(text);
            panel.Children.Add(ellipse);

            listBox2.Items.Add(panel);

            Label label = new Label();
            label.Content = "book";

            listBox2.Items.Add(label);
        }

增加几行代码来读取内容,如:

        private void listBox2_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            int i = listBox2.SelectedIndex;
            switch(i)
            {
                case 0:
                    StackPanel panel = (StackPanel)listBox2.SelectedItem;

                    TextBox text = (TextBox)panel.Children[0];

                    MessageBox.Show(text.Text, "hint");

                    break;
                case 1:
                    Label l = (Label)listBox2.SelectedItem;
                    MessageBox.Show((string)l.Content, "hint");
                    break;
                default:
                    break;
            }
        }


 

运行一下,左边的listbox是XAML设置内容的,右边的是动态生成的。



相关文章推荐

WPF ListBoxItem模板

这个模板主要是实现一个带有图标的

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C# 编写带图标和tooltip的ListBox

上午刚写了一篇关于带ToolTip的ListBox控件,这一篇是针对所有项,无论项文本长度有无超出控件,都会呈现ToolTip。现在这一篇基础上加一些限制并引进图标显示,只对超出部分的项才呈现Tool...
  • luols
  • luols
  • 2012年01月07日 21:02
  • 6614

【WPF】后台传数据给前台ListBox显示(实时显示)

因为需要实时接受数据并显示到前台ListBox中,所有使用下面这个方法。因为WPF前台的样式可以做的很炫,就用到style去写样式。 前台: Window.Resources> Style ...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

WPF中ListBox的创建和多种绑定用法

本篇博文为翻译(http://www.c-sharpcorner.com/uploadfile/mahesh/listbox-in-wpf/),本篇博文主要介绍ListBox控件的创建和用法。 先从...

WPF学习笔记:获取ListBox的选中项

有代码有J8:UI

C# 图片加载、导出、缩放、质量、缩略图

using System; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Drawing2D; us...

WPF中简单的图片浏览功能

废话不说直接上代码: /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Win...

wpf ListBox获取选中内容 ComboBox

最近项目要用wpf做,没接触过.net的c++程序员,只好开始学习wpf了。首先,确定你的listbox的item是什么类型:1)文本类型    一般是通过如下简单代码添加的item:    list...
  • Alsmile
  • Alsmile
  • 2011年06月27日 12:46
  • 7314
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WPF - ListBox显示任意内容
举报原因:
原因补充:

(最多只允许输入30个字)