2011-06-21 35 views
13

我用:的BitmapImage在WPF不锁文件

Dim bmi As New BitmapImage(New Uri(fiInfo.FullName, UriKind.Absolute)) 
bmi.CacheOption = BitmapCacheOption.OnLoad 

这并不Use OnLoad 和文件仍然被锁定覆盖在硬盘。任何想法如何解锁?

问候

+0

还有内存问题需要看看。见http://stackoverflow.com/questions/6271891/net-memory-issues-loading-40-images-memory-not-reclaimed-potentially-due-to-l/6271982#6271982 – Oppositional

+0

谢谢。你是否想让我说,如果你的链接不可能实现缓存所有文件? – Nasenbaer

回答

30

如您链接到的问题显示,你需要调用BeginInit在和EndInit,像这样以及设置UriSource属性:

Dim bmi As New BitmapImage() 
bmi.BeginInit() 
bmi.CacheOption = BitmapCacheOption.OnLoad 
bmi.UriSource = New Uri(fiInfo.FullName, UriKind.Absolute) 
bmi.EndInit() 
+0

感谢您对我的关键字和VB而不是C#的快速回复!现在很好用! – Nasenbaer

+0

是否有严格使用XAML的方式来执行此操作。 – TrustyCoder

7

从文件中读取的BitmapImage并用MemoryStream改写它:

MemoryStream ms = new MemoryStream(); 
BitmapImage bi = new BitmapImage(); 
byte[] bytArray = File.ReadAllBytes(@"test.jpg"); 
ms.Write(bytArray, 0, bytArray.Length);ms.Position = 0; 
bi.BeginInit(); 
bi.StreamSource = ms; 
bi.EndInit(); 
image.Source = bi; 
+0

谢谢Navid您的快速回复。据我所知,我认为这将以这种方式发挥作用。我现在使用'bmi.EndInit()'方法+'OnLoad '这对我来说更简单一些。 – Nasenbaer

+0

现在,谁拥有MemoryStream对象实例并负责处理它? – Henrik

+1

无论如何...如何解锁文件并将其删除? –

0
BitmapFrame.Create(new Uri(filePath), BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
2

我作为imilar的问题,我解决了使用这种方法: (这是一个答案here的个性化)

public static BitmapImage BitmapFromUri(Uri source) 
    { 
     var bitmap = new BitmapImage(); 
     bitmap.BeginInit(); 
     bitmap.UriSource = source; 
     bitmap.CacheOption = BitmapCacheOption.OnLoad; 
     bitmap.EndInit(); 
     return bitmap; 
    } 

您可以打开图像是这样的:

BitmapImage bimg = BitmapFromUri(new Uri(some_URI)); 

并将其加载之后立刻释放图像。

希望它可以帮助!