在我的课程中将图像控制绑定到BitmapImage

时间:2013-06-01 12:54:46

标签: c# wpf image binding bitmapimage

每当我想要显示过去的图像时,我将图像路径绑定到图像的源属性。太容易了。

现在我想要更改图像并始终使用显示图像最新更改。更改图像保存在我班级的BitmapImage属性中。因此,我没有要求图像控件从光盘加载图像,而是希望将其直接绑定到我的BitmapImage属性。但图像没有显示。

然后(仅用于测试)我创建了一个值转换器,使用其中的图像路径创建BitmapImage并将其返回到控件 - 图像显示。

再次:从变形者内部的路径创建BitmapImage。将图像控件绑定到我的类中使用相同代码创建的BitmapImage属性失败。

这描述了同样的问题,但“解决方案”不起作用。 (我想知道为什么它被标记为已解决,因为OP发表了相同的评论)

https://stackoverflow.com//questions/7263509/directly-binding-a-bitmapimage-created-inside-a-class-bound-to-a-listbox-in-wpf

编辑:这是一些代码

这是成功创建可见图像的转换器。

public class BsConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        BitmapImage bi = new BitmapImage(new Uri(value.ToString()));

        return bi;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

...以及显示图像的XAML绑定。 File类型为FileInfoFullName包含完整路径。

<Image MinHeight="100" MinWidth="100" Source="{Binding SelectedImage.File.FullName, Converter={StaticResource BsConverter}}"/>

我有一个属性BitmapImage image { get; set; },我在我的类的构造函数中初始化:

image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(file.FullName);
image.CacheOption = BitmapCacheOption.OnLoad;
image.EndInit();

......和绑定。但是 - 没有快乐。图像不会显示。

<Image MinHeight="100" MinWidth="100" Source="{Binding SelectedImage.image}"/>

2 个答案:

答案 0 :(得分:3)

该物业必须是公开的。为了更新绑定,定义属性的类必须实现INotifyPropertyChanged接口。

public class SelectedImage : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private ImageSource image;

    public ImageSource Image
    {
        get { return image; }
        set
        {
            image = value;

            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Image"));
            }
        }
    }
}

答案 1 :(得分:1)

我遇到了同样的问题,它似乎与图片的定时和异步加载有关。可能转换器代码在Dispatcher中以不同的优先级运行,因此它的行为方式不同。

对于我的项目,我通过在代码中显式预加载BitmapImage来解决这个问题,比如

        Dim result As ScaleItImageSource = Nothing

    Dim stream As System.IO.FileStream = Nothing
    Try
        stream = New System.IO.FileStream(fileName, IO.FileMode.Open, IO.FileAccess.Read)
        Dim decoder As BitmapDecoder = System.Windows.Media.Imaging.BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad)
        If decoder.Frames.Count > 0 Then
            result = New ScaleItImageSource(decoder.Frames(0), fileName)
        End If
    Finally
        If stream IsNot Nothing Then
            stream.Close()
        End If
    End Try

    Return result