WPF更改映像路径并在运行时显示新映像

WPF更改映像路径并在运行时显示新映像,wpf,image,bitmapimage,imagesource,Wpf,Image,Bitmapimage,Imagesource,我有WPF映像,它的源是硬盘上的本地映像URI,我正在使用转换器加载它 我想更改硬盘上的映像(用另一个映像替换) 并在运行时显示新图像 这里是图像的XAML <Image Stretch="Fill"> <Image.Style> <Style TargetType="Image"

我有WPF映像,它的源是硬盘上的本地映像URI,我正在使用转换器加载它

我想更改硬盘上的映像(用另一个映像替换) 并在运行时显示新图像

这里是图像的XAML

 <Image  Stretch="Fill">
                                            <Image.Style>
                                                <Style TargetType="Image">
                                                    <Setter Property="Source" Value="{Binding ImagePath,Converter={StaticResource ImageFileLoader},UpdateSourceTrigger=PropertyChanged}"/>
                                                </Style>
                                            </Image.Style>
                                        </Image>
}


注意:我试图将转换器中的
CacheOption
更改为
BitmapCacheOption。无
或任何其他选项。。。它不起作用,因为在本例中,当框架加载
图像时,我无法更改硬盘上的图像,这会让人恼火,因此如果您尝试删除或移动实际图像文件,您将得到一个
异常
,表示由于正在使用该文件而无法访问该文件。为了解决这个问题,我创建了一个与您类似的
IValueConverter
,以便将
Image.CacheOption
设置为
BitmapCacheOption.OnLoad
,在加载时将整个图像缓存到内存中,从而消除保留

但是,我的转换器中的代码看起来与您的类似,所以我不确定为什么它对您不起作用。以下是我的
IValueConverter
代码的外观:

using (FileStream stream = File.OpenRead(filePath))
{
    image.BeginInit();
    image.StreamSource = stream;
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.EndInit();
}

@Clemens不,它没有实现它,但是当ImagePath属性更改时,它会响应事件触发属性更改。对不起,我误读了您的XAML。必须实现INotifyPropertyChanged的不是ImageFileLoader类,而是声明
ImagePath
属性的类。您可能也应该发布该代码的相关部分。是的,包含属性“ImagePath”的模型类实现了INotifyPropertyChanged接口。。。这是一个简单的类,你可以想象它只是有ImagePath属性。有什么特别的理由在样式设置器中设置图像控件的
绑定吗?您可以直接在图像声明中执行,如
。源属性是否也可能在其他任何地方设置,因此绑定会被覆盖?不,没有具体原因,并且源属性在任何地方都不会被更改,我只想手动更改文件并在屏幕上显示更改谢谢您的回复我的问题不是我无法手动更改图像文件,我可以更改文件(重命名甚至删除它)主要问题是UI上没有显示更改。请确保已在
ImagePath
属性上实现了
INotifyPropertyChangedInterface
。如果没有帮助,您可能还需要先将文件路径属性设置为空字符串(以清除旧路径),然后将其设置为新值。谢谢。。。整个问题是IMAGPathChanged image.UriSource到image.StreamSource的值设置错误,并将Filestream而不是文件路径提供给它,这对我来说是个好办法!谢谢
using (FileStream stream = File.OpenRead(filePath))
{
    image.BeginInit();
    image.StreamSource = stream;
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.EndInit();
}