锁定资源(图像文件)管理

时间:2012-06-22 17:57:34

标签: c# wpf resources caliburn.micro

该应用程序是一个桌面文档管理系统。图像文件(扫描的文档)存储在共享网络文件夹及其索引在数据库中。现在,当显示所选文档页面的图像时,用户可以选择将其删除(通过上下文菜单)。问题是,如果我尝试这样做,那么它会抛出一个异常(资源被锁定),它具有所有意义,因为它正在屏幕上显示。所以,目前我维护一个持久删除队列。一旦应用程序启动,我进入队列并删除索引从DB中删除的文档的页面,并且假定它们没有显示删除成功,但这似乎是非常糟糕的代码(我的意思是它有效,但不是尽管它应该干净,我猜。)

我的快速解决方案有多糟糕。鉴于该应用程序是单用户,则用户需要为应用程序加注星标以使用它。这是一个非常糟糕的主意,还是我可以使用其他路径实现。

通过将图像绑定到当前文件来显示图像(在文档查看器中):

查看:

<Image Name="PageViewedPath" Margin="20" Grid.Column="0" />

视图模型:

public string PageViewedPath { get; set; }

一旦用户点击下一个或上一个我改变(在ViewModel中的PageViewedPath)。也许问题是这个我无法控制的绑定,我正在使用Caliburn Micro,这就是为什么只需设置图像名称即可完成绑定。

我认为可能重写此绑定并在显示之前创建图像的硬拷贝必须有效但我不确定它是否会更糟,如何做到。

2 个答案:

答案 0 :(得分:1)

我在我开发的使用图像池的应用程序中遇到了类似的问题。虽然图像不再显示,但文件已锁定且无法删除。

我通过使用BitmapCacheOption.OnLoad加载图片解决了我的问题,如下所示:

Image myImage = new Image();
BitmapImage bi = new BitmapImage();
bi.BeginInit();

bi.CacheOption = BitmapCacheOption.OnLoad;
bi.UriSource = imageUri;

// End initialization.
bi.EndInit();
myImage.Source = bi;

以下是msdn帖子的链接,该帖子显示了如何使用xaml中的BitmapCacheOption:

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/3cb97997-941f-42a8-a03b-f84b152c1139/

答案 1 :(得分:0)

如果您从自己的代码中锁定文件的代码 - 停止锁定。您可能在加载图片的某处错过了一些using / Dispose次调用。

如果它不是您的代码或您需要处理由于使用共享文件位置而导致的故障 - 您的解决方案可能没问题。此外,大多数用户不会期望这样的行为 - 我的正常期望是文件即时删除或永远不删除。