每当我想要显示过去的图像时,我将图像路径绑定到图像的源属性。太容易了。
现在我想要更改图像并始终使用显示图像最新更改。更改图像保存在我班级的BitmapImage
属性中。因此,我没有要求图像控件从光盘加载图像,而是希望将其直接绑定到我的BitmapImage
属性。但图像没有显示。
然后(仅用于测试)我创建了一个值转换器,使用其中的图像路径创建BitmapImage
并将其返回到控件 - 图像显示。
再次:从变形者内部的路径创建BitmapImage
。将图像控件绑定到我的类中使用相同代码创建的BitmapImage
属性失败。
这描述了同样的问题,但“解决方案”不起作用。 (我想知道为什么它被标记为已解决,因为OP发表了相同的评论)
编辑:这是一些代码
这是成功创建可见图像的转换器。
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}"/>
答案 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