C# UWP-图像不';当它引用的图像文件发生更改时,不能更改内容

C# UWP-图像不';当它引用的图像文件发生更改时,不能更改内容,c#,uwp,C#,Uwp,我正在尝试拍摄视频快照并用滚动条预览它。假设我们有bohemian.mp4,我的应用程序将在某个点拍摄快照并保存到bohemian.png。这是前面提到的部分 xaml: public CommandEventHandler<double> UpdateSnapshotCmd { get { return new CommandEventHandler<double>(

我正在尝试拍摄视频快照并用滚动条预览它。假设我们有
bohemian.mp4
,我的应用程序将在某个点拍摄快照并保存到
bohemian.png
。这是前面提到的部分

xaml:

public CommandEventHandler<double> UpdateSnapshotCmd
        {
            get
            {
                return new CommandEventHandler<double>(
                    async (second) => await UpdateSnapshotPreview(second)
                    );
            }
        }

public async Task UpdateSnapshotPreview(double second)
        {
            try
            {
                if (mp4 == null)
                {
                    mp4 = await StorageFile.GetFileFromPathAsync(mp4Path);
                }

                var imgName = Path.ChangeExtension(mp4.Name, ".png");

                StorageFile imgFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(imgName, CreationCollisionOption.ReplaceExisting);

                MediaComposition mediaComposition = new MediaComposition();
                MediaClip mediaClip = await MediaClip.CreateFromFileAsync(mp4);
                mediaComposition.Clips.Add(mediaClip);
                
                var interval = TimeSpan.FromSeconds(second);
                var thumbnail = await mediaComposition.GetThumbnailAsync(interval, 
                    1024, 768, VideoFramePrecision.NearestKeyFrame);

                using (var randomAccess = await imgFile.OpenAsync(FileAccessMode.ReadWrite))
                using (var destStream = randomAccess.AsStream())
                using (var sourceStream = thumbnail.AsStream())
                {
                    await sourceStream.CopyToAsync(destStream);
                }

                mp3ViewerModel.ImagePath = imgFile.Path;
            }
            catch (Exception ex)
            {
                await new MessageDialog(ex.Message).ShowAsync();
            }
            
        }

出于调试目的,我会让
按钮
处理我的
命令

查看模型:

public CommandEventHandler<double> UpdateSnapshotCmd
        {
            get
            {
                return new CommandEventHandler<double>(
                    async (second) => await UpdateSnapshotPreview(second)
                    );
            }
        }

public async Task UpdateSnapshotPreview(double second)
        {
            try
            {
                if (mp4 == null)
                {
                    mp4 = await StorageFile.GetFileFromPathAsync(mp4Path);
                }

                var imgName = Path.ChangeExtension(mp4.Name, ".png");

                StorageFile imgFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(imgName, CreationCollisionOption.ReplaceExisting);

                MediaComposition mediaComposition = new MediaComposition();
                MediaClip mediaClip = await MediaClip.CreateFromFileAsync(mp4);
                mediaComposition.Clips.Add(mediaClip);
                
                var interval = TimeSpan.FromSeconds(second);
                var thumbnail = await mediaComposition.GetThumbnailAsync(interval, 
                    1024, 768, VideoFramePrecision.NearestKeyFrame);

                using (var randomAccess = await imgFile.OpenAsync(FileAccessMode.ReadWrite))
                using (var destStream = randomAccess.AsStream())
                using (var sourceStream = thumbnail.AsStream())
                {
                    await sourceStream.CopyToAsync(destStream);
                }

                mp3ViewerModel.ImagePath = imgFile.Path;
            }
            catch (Exception ex)
            {
                await new MessageDialog(ex.Message).ShowAsync();
            }
            
        }

当我选中保存的文件夹时,
png
文件被更改为
Slider.Value
但应用程序中的
Image
只响应了一次。如何修复此问题?

我认为,因为文件路径保持不变,所以导致
图像的行为相同,尽管内容不同或
OnPropertyChanged
调用不同

因此,我在视图模型中找到了一个解决方案:

public CommandEventHandler<double> UpdateSnapshotCmd
        {
            get
            {
                return new CommandEventHandler<double>(
                    async (second) => await UpdateSnapshotPreview(second)
                    );
            }
        }

public async Task UpdateSnapshotPreview(double second)
        {
            try
            {
                if (mp4 == null)
                {
                    mp4 = await StorageFile.GetFileFromPathAsync(mp4Path);
                }

                var imgName = Path.ChangeExtension(mp4.Name, ".png");

                StorageFile imgFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(imgName, CreationCollisionOption.ReplaceExisting);

                MediaComposition mediaComposition = new MediaComposition();
                MediaClip mediaClip = await MediaClip.CreateFromFileAsync(mp4);
                mediaComposition.Clips.Add(mediaClip);
                
                var interval = TimeSpan.FromSeconds(second);
                var thumbnail = await mediaComposition.GetThumbnailAsync(interval, 
                    1024, 768, VideoFramePrecision.NearestKeyFrame);

                using (var randomAccess = await imgFile.OpenAsync(FileAccessMode.ReadWrite))
                using (var destStream = randomAccess.AsStream())
                using (var sourceStream = thumbnail.AsStream())
                {
                    await sourceStream.CopyToAsync(destStream);
                }

                mp3ViewerModel.ImagePath = imgFile.Path;
            }
            catch (Exception ex)
            {
                await new MessageDialog(ex.Message).ShowAsync();
            }
            
        }
StorageFile imgFile=wait ApplicationData.Current.TemporaryFolder.CreateFileAsync(imgName,
CreationCollisionOption.ReplaceExisting);
改为:

StorageFile imgFile=wait ApplicationData.Current.TemporaryFolder.CreateFileAsync(imgName,
CreationCollisionOption.GenerateUniqueName);

但是,这将创建一堆
png
,看起来很难看。我想知道是否有任何替代解决方案可以重复使用第一个也是唯一的
png

使用a来监视文件的更改:

这是正确的,我建议使用解码图像绑定到视图,这样您也不必将图像保存到文件,只需创建一个图像源变量并为其赋值并绑定相同的值,这样当滑块更改时,图像源可以直接更新,而无需保存到文件