2008-11-12 13 views
10

XPS belgelerini açan ve görüntüleyen bir WPF uygulamasında çalışıyorum. Uygulama kapatıldığında, teknik özellik, uygulamanın temizlenecek XPS belgesini silmesi gerektiği anlamına gelir. Ancak, belirli bir XPS belgesini açarken, uygulama, dosyayı silmeyi denediğinde hala kullanımda olduğu bir istisna atar. Bu biraz garip çünkü sadece belirli bir XPS belgesini açarken ve sadece ilk sayfanın ötesine geçtiğinizde olur. WPF DocumentViewer XPS dosyasını açmıyor

I kullanılan kodların bazı

aşağıda gösterilmiştir: XPS belgesi navigasyon için

DocumentViewer m_documentViewer = new DocumentViewer(); 
XpsDocument m_xpsDocument = new XpsDocument(xpsfilename, fileaccess); 
m_documentViewer.Document = m_xpsDocument.GetFixedDocumentSequence(); 
m_xpsDocument.Close(); 

: XPS Belge açılması için

DocumentViewer nesnesi kapatılması için

m_documentViewer.FirstPage(); 
m_documentViewer.LastPage(); 
m_documentViewer.PreviousPage(); 
m_documentViewer.NextPage(); 

ve dosyayı silme:

Her şey oldukça basit ve test ettiğimiz diğer belgelerle çalışıyor. Ancak, belirli XPS belgesinde, silinecek dosyanın hala kullanılmakta olduğunu belirten bir istisna ortaya çıkıyor.

Kodumda yanlış veya eksik bir şey mi var?

Teşekkürler!

cevap

2

üyesi xpsDocument olun, ardından() üzerinde yakın demiyorlar :)

+0

bu bir çalıştı Hey! Sadece açık XpsDocument nesne bıraktı ve sadece adlandırılan XpsDocument.Close() çıkışında sırasında ve ben dosyayı silmek başardı. teşekkürler moogs! –

+1

Bu, yalnızca uygulamanızı kilidi serbest bırakmak için kapatabilirseniz çalışır. Başvurunuz açık kalır iken serbest kilit gerekiyorsa altında veya http://stackoverflow.com/questions/1442607/how-do-i-get-wpfs-documentviewer-to-release-its benim cevap görmek gerekir -dosyadan-lock-on-the-kaynak-xps'yi-docu –

0

Cevabınız için teşekkürler!

Biraz alçak seviyededir ama fikir tükendiğimde akılda tutulacağım. Her neyse, bug hakkında biraz daha fazla şey öğrendim. İstisna neden olan özel dokümanlar, bunlara eklenmiş görüntülere sahiptir. Görüntüleri kaldırdığımda istisna gerçekleşmez. Bu bir DocumentViewer hata olabilir belki ama ben hala deniyorum ...

0

Nope, şimdiye kadar hala hiçbir şey. null

  1. Set herşeyi penceresinin "Kapalı" durumunda dosyayı silmeden önce:

    Sadece ben başarısız aşağıdaki yöntemleri denedim, numaralandırmak için. Bu DocumentViewer.Document özelliği ve DocumentViewer nesnesini içerir.

  2. Pencereyi açmak ve daha sonra null olarak ayarlamak için ShowDialog() kullanılır. Dosyanın silinmesi, pencereyi açan System.Windows.Application nesnesinin "Çıkış" olayına taşındı. Hala dosyanın kullanıldığı istisnayı atar.

DocumentViewer hata ???

6

Sen izleyiciye atanan XpsDocument açıldığı System.IO.Packaging.Package kapatmak gerekir. Eğer aynı uygulama oturum içinde tekrar aynı dosyayı açmaya muktedir istiyorsanız Dahası, sen PackageStore gelen Paketi kaldırmak gerekir.

deneyin

var myXpsFile = @"c:\path\to\My XPS File.xps"; 
var myXpsDocument = new XpsDocument(myXpsFile); 
MyDocumentViewer.Document = myXpsDocument; 

//open MyDocumentViwer's Window and then close it 
//NOTE: at this point your DocumentViewer still has a lock on your XPS file 
//even if you Close() it 
//but we need to do something else instead 

//Get the Uri from which the system opened the XpsPackage and so your XpsDocument 
var myXpsUri = myXpsDocument.Uri; //should point to the same file as myXpsFile 

//Get the XpsPackage itself 
var theXpsPackage = System.IO.Packaging.PackageStore.GetPackage(myXpsUri); 

//THIS IS THE KEY!!!! close it and make it let go of it's file locks 
theXpsPackage.Close(); 

File.Delete(myXpsFile); //this should work now 

//if you don't remove the package from the PackageStore, you won't be able to 
//re-open the same file again later (due to System.IO.Packaging's Package store/caching 
//rather than because of any file locks) 
System.IO.Packaging.PackageStore.RemovePackage(myXpsUri); 

Evet, muhtemelen Paketi XpsDocument açmadı ve hatta bir ne olduğunu bilmiyor olabilir biliyorum - ya özen - ama .NET arkasında "için" teşekkür yaptım sahneler ve kendini temizlemeyi unutur.

İlgili konular