如何在wpf图像控件中正确显示位图?

时间:2015-04-07 09:33:27

标签: c# wpf image

我有一个带有ListBox的表单包含许多项目。每个项目都应该有标题和图像。这是我的XAML:

 <ListBox x:Name="MyList" HorizontalAlignment="Left" Height="384" Margin="10,505,0,0" VerticalAlignment="Top" Width="366"
        ItemsSource="{Binding}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <!--This works:-->
                    <Label Content="{Binding Title}"/>
                    <!--This doesn't:-->
                    <Image Width="50" Height="50" Source="{Binding Cover}" Stretch="UniformToFill"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

我的数据类看起来像这样:

class Data
{
    public BitmapImage Cover{ get; set; }
    public string Title{ get; set; }
}

我从这样的BitmapImage获得了Bitmap

Data data;//this is my data object
Bitmap bitmap;//this is my bitmap. It holds a valid image, I've checked.
MemoryStream memory = new MemoryStream();
bitmap.Save(memory, ImageFormat.Bmp);
memory.Position = 0;
data.Cover = new BitmapImage();
data.Cover.BeginInit();
data.Cover.StreamSource = memory;
data.Cover.CacheOption = BitmapCacheOption.OnLoad;
data.Cover.EndInit();

最后,我设置列表的数据如下:

MyList.ItemsSource = dataList;//dataList is a List<Data>

将标题(或其他简单属性,如日期或int属性)绑定到Label可以正常工作,但图像不会显示。如何正确显示?

2 个答案:

答案 0 :(得分:2)

因此,Cover类中的Data属性需要引发属性更改事件,以使视图知道它需要在更改时再次获取图像。要做到这一点很简单:

class Data, INotifyPropertyChanged
{
     private BitmapImage _cover;
     public BitmapImage Cover
     {
        get { return _cover; }
        set 
        { 
            _cover = value;
            OnPropertyChanged("Cover");
        }
     }

    public string Title{ get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

答案 1 :(得分:0)

您的Cover init代码在我的项目中运行正常。 我想你忘了发布以下内容: dataList.Add(数据); 我不知道你为什么两次设置ItemsSource属性。如果您使用MVVM并绑定ItemsSource属性,则不应从代码中设置该属性(MyList.ItemsSource = dataList;) 相反,我会在XAML中建议ItemsSource =“{Binding} dataList”。