为什么我的映像更新没有“绑定”
本文关键字:绑定 我的 映像 更新 为什么 | 更新日期: 2023-09-27 17:55:37
我对我的对象"会话"有一个大致的视图。在用户选择时,每个会话的图像都会显示在我的 GUI 上的图像中。我有这个例程,在用户SelectedSession
上,它会删除任何现有图像,获取新图像frameSource
,将其保存在本地,然后将私有成员变量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}"/>
在"会话.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 上的图像。然而,一个非常奇怪的行为正在发生:
- 它正在删除旧的图像文件,我可以在Windows资源管理器中看到该文件已消失。
- 它正在正确保存新的
- 它正在从正确的路径加载新图像
- 但是,它只显示我拍摄过的第一张照片。
无论我发送什么新图像。它始终显示我第一次拍摄的相同图像。谁能帮我检查一下?我验证了整个代码,所有值都是合乎逻辑的。任何地方都没有语法错误。
编辑:
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)
{
}
}
WPF 缓存从 URI 加载的位图。为避免这种情况,请直接从文件加载位图图像:
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;
}