将ListView绑定到Bitmap的ObservableCollection

时间:2013-01-17 19:13:33

标签: wpf binding observablecollection

我在将ListView绑定到ObservableCollection<Bitmap> ...

时遇到了一些问题

这是我的XAML

<ListView ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Disabled"
      ItemsSource="{Binding Path=FrameImages}">
<ListView.ItemsPanel>
    <ItemsPanelTemplate>
        <WrapPanel
            Width="Auto"
            ItemWidth="{Binding (ListView.View).ItemWidth, RelativeSource={RelativeSource AncestorType=ListView}}"
            ItemHeight="{Binding (ListView.View).ItemHeight, RelativeSource={RelativeSource AncestorType=ListView}}" />
    </ItemsPanelTemplate>
</ListView.ItemsPanel>

<ListView.ItemTemplate>
    <DataTemplate>
        <Border Width="100" Height="75" BorderThickness="1" BorderBrush="DarkGray" VerticalAlignment="Center" Margin="7,5,7,5">
            <Image Margin="5,5,5,5" Width="100" Height="75" Source="{Binding}" Stretch="Fill"></Image>
        </Border>
    </DataTemplate>
</ListView.ItemTemplate>
</ListView>

代码背后:

public ObservableCollection<Bitmap> FrameImages { get; set; }
public MainWindow()
{
    InitializeComponent();

    this.DataContext = this;

    FrameImages = new ObservableCollection<Bitmap>();
    Bitmap img = new Bitmap(@"E:\test\3047817.bmp");
    FrameImages.Add(img);
}

当我添加元素时,它似乎出现在ListView中,但它是透明的(只是一个空框架):/我试图将位图保存回文件并且没有问题(与原始相同)一)。我不知道为什么它不起作用:(

[编辑]
顺便说一句。如果我将ObservableCollection<Bitmap>替换为ObservableCollection<BitmapSource>,我的代码就有效。但这是影响程序性能的额外转换...这就是我需要Bitmap的原因。

1 个答案:

答案 0 :(得分:2)

您不能在WPF应用程序中使用System.Drawing.Bitmap。该类不属于WPF。它封装了一个GDI +位图,而WPF is based in DirectX。因此,您需要使用BitmapSource。

但是,您可以简单地将ListView的ItemsSource属性绑定到图像路径字符串的集合。从字符串到ImageSource的必要转换由WPF自动执行。

如果您确实需要手动创建位图,则应将集合定义为ObservableCollection<ImageSource>并通过以下方式创建集合元素:

var img = new BitmapImage(new Uri(@"E:\test\3047817.bmp"));
FrameImages.Add(img);

您可能需要查看Imaging Overview。您应该熟悉WPF中的BitmapSource类层次结构。