将图像控件绑定到我的类中的BitmapImage。

4
过去,每当我想要显示一张图片时,我就将图片路径绑定到图片的源属性上。太简单了。
现在我想更改图片并始终显示最新更改的图片。更改后的图片保存在我的类中的一个 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 的类型为 FileInfo,而 FullName 保存了完整路径。

<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}"/>

image 属性需要是公共的。为了在属性值更改时更新绑定,您需要实现 INotifyPropertyChanged 接口,或将 image 设为依赖属性。广泛接受的 编码规范 建议使用帕斯卡命名法来命名属性,因此应该使用 Image - Clemens
天啊,已经这么晚了,我得去睡觉了。真是个愚蠢的错误。非常感谢你! - Peter
Clemens,如果您将那个提示作为答案发布,我会接受它。 - Peter
2个回答

4

属性必须是公共的。为了更新绑定,定义该属性的类必须实现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
我遇到了相同的问题,似乎与时间和异步加载图片有关。可能是转换器代码在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接