我对我的对象“Sessions”有一个视角。在用户选择时,每个会话的图像都显示在我的GUI上的图像中。我有这个例程,在用户SelectedSession
上,删除任何现有图像,拍摄新图像 frameSource
,保存< / em>在本地,然后将私有成员变量 ImagePath
设置为其路径:
public Session SelectedSession { get { return selectedSession; } set { SetValue(ref selectedSession, value); } }
public BitmapSource SessionImage { get { return sessionImage; } private set { SetValue(ref sessionImage, value); } }
//..
public void TakeSessionImage(BitmapSource frameSource)
{
if (SelectedSession != null)
{
if (File.Exists(SelectedSession.ImagePath))
File.Delete(SelectedSession.ImagePath); // delete old - works
SelectedSession.ImagePath = FileStructure.CurrentSessionPath + "\\" + SelectedSession.Name + ".png"; // set ImagePath - works - Technically it does not change. I kept it if I needed later to add anything to the file name like GUID or whatever
ImageIO.RotateAndSaveImage(SelectedSession.ImagePath, (WriteableBitmap)frameSource, -270); // save new image - works
SessionImage = SelectedSession.LoadImageFromFile(); // binded the image to display
}
}
在Xaml中绑定:
<Image x:Name="currentSessionImage" Source="{Binding SessionImage}"/>
在“Session.cs”课程中:
public BitmapImage LoadImageFromFile()
{
if (File.Exists(ImagePath)) // image path is correct
{
try
{
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = new Uri(ImagePath);
image.EndInit();
return image;
}
catch
{
return null;
}
}
return null;
}
这已经过调试,所有语句都有效。 SessionImage
是我的属性,在我的GUI上与图像“绑定”。然而,一种非常奇怪的行为正在发生:
无论我发送什么新图像。它总是显示我第一次拍摄的相同图像。有人可以帮我查一下吗?我验证了整个代码,所有值都是合乎逻辑的。任何地方都没有语法错误。
修改
protected virtual bool SetValue<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
if (!EqualityComparer<T>.Default.Equals(storage, value))
{
storage = value;
OnPropertyChanged(propertyName);
return true;
}
return false;
}
//..
protected void OnPropertyChanged(string propertyName)
{
try
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
catch (Exception ex)
{
}
}
答案 0 :(得分:2)
WPF缓存从URI加载的位图。为避免这种情况,请直接从文件加载BitmapImage:
using (var fileStream = new FileStream(ImagePath, FileMode.Open, FileAccess.Read))
{
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = fileStream;
image.EndInit();
return image;
}