C# WPF使用URL源缓存图像
我试图在我的MVVMWPF应用程序中显示一个带有URL源的图像。我使用的Xaml是:C# WPF使用URL源缓存图像,c#,wpf,xaml,caching,mvvm,C#,Wpf,Xaml,Caching,Mvvm,我试图在我的MVVMWPF应用程序中显示一个带有URL源的图像。我使用的Xaml是: <ContentControl> <Image Margin="5" Height="190" Source="{Binding CampaignMainImage}"/> </ContentControl> 在我的视图模型中,我尝试将其与活动主图像作为字符串和位图图像绑定。在这两种情况下,图像源都来自web URL。这两种方法都有效,我的应用程序成功地显示了图
<ContentControl>
<Image Margin="5" Height="190" Source="{Binding CampaignMainImage}"/>
</ContentControl>
在我的视图模型中,我尝试将其与活动主图像
作为字符串
和位图图像
绑定。在这两种情况下,图像源都来自web URL。这两种方法都有效,我的应用程序成功地显示了图像
但是,在同一个应用程序中,我需要允许用户上传新图像。我通过文件选择和ftp上传来实现这一点。我成功地完成了上传,并看到断点命中了引发PropertyChanged
事件的位置
问题是,新映像的名称必须与旧映像的名称相同,而且WPF似乎正在缓存该映像。即使我在应用程序中关闭该窗口并新建viewmodel
的实例,仍然会显示旧图像。当我关闭应用程序并再次运行时,将显示新图像
如何停止这种缓存行为
编辑:
建议的副本解决了绑定到
位图图像
(与视图相关的类型)的问题。如下面评论中的Tseng所示,这是一个非MVVM解决方案,通过数据绑定查看相关类型不会破坏模型。更具体地说,问题是如何在不破坏MVVM模式的情况下实现这种缓存行为。这个问题实际上已经被提出并得到了回答(感谢科伦坡博士的指出)。但是(正如tseng所指出的那样),答案不属于MVVM模式,而是通过在viewmodel中使用视图类型元素(BitmapImage
)来打破该模式
对于那些对非MVVM答案感兴趣的人,可以找到前面问题的链接
非MVVM解决方案是设置
bitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache
创建位图图像时。这里已经给出了答案:非常感谢。我搜索这个问题已经有一段时间了,但不知怎么的,我没有看到。这个问题并不完全是重复的。这个问题用MVVM标记,链接的问题是关于WPF的。在ViewModel中使用
BitmapImage
违反了MVVM模式。您可以在视图的xaml中执行此操作,也可以在UI的代码隐藏中执行此操作。在MVVM中,两者都非常好。另一种方法是在虚拟机中下载图像,然后将图像作为字节数组公开。在我看来,如果您想要一个“MVVM”解决方案,您需要首先明确解释您认为标记的副本“违反MVVM模式”的方式。请注意,您不必在实际视图模型中放置位图图像
,因此您可能希望使用位图图像本身并不违反MVVM。另外,请不要在标题中添加标签。请参阅我在上面的评论。使用这种方法违反了MVVM模式方法。无法将数据绑定到位图图像
,因为它是与视图相关的类型(在PresentationCore.dll中定义,这是特定于WPF的程序集)。在Viewmodel中使用它会创建与WPF的紧密耦合,这是您希望使用MVVMV避免的,感谢您指出这一点。我已经编辑了问题和答案,并投票赞成重新打开问题。