2011-06-21 57 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)); 

並將其加載之後立刻釋放圖像。

希望它可以幫助!