为什么我的映像更新没有“绑定”

本文关键字:绑定 我的 映像 更新 为什么 | 更新日期: 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;
}