我在将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
的原因。
答案 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类层次结构。