0

我有一些绑定我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.

4

1 回答 1

2

您不能在 WPF 应用程序中以这种方式使用System.Drawing.Bitmap 。该类不属于 WPF。它封装了 GDI+ 位图,而WPF 基于 DirectX。因此,您需要使用 BitmapSource。

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

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

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

您可能想看看成像概述。您应该熟悉 WPF 中的BitmapSource类层次结构。

于 2013-01-17T19:56:19.823 回答