.net wpf xps documentviewer

.net - WPF DocumentViewer no lanza el archivo XPS



(6)

Estoy trabajando en una aplicación WPF que abre y muestra documentos XPS. Cuando la aplicación se cierra, la especificación es que la aplicación debe eliminar el documento XPS abierto para su limpieza. Sin embargo, al abrir un determinado documento XPS, la aplicación arroja una excepción que indica que el archivo aún está en uso cuando intenta eliminarlo. Es un poco extraño porque solo ocurre cuando se abre un documento XPS particular y solo cuando se ha movido más allá de la primera página.

Algunos de los códigos que utilicé se muestran a continuación:

Para abrir el documento XPS:

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

Para navegar por el documento XPS:

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

Para cerrar el objeto DocumentViewer y eliminar el archivo:

m_documentViewer.Document = null; m_documentViewer = null; File.Delete(xpsfilename);

Todo es bastante básico y funciona con los otros documentos que probamos. Pero con el documento XPS particular, aparece una excepción que dice que el archivo que se va a eliminar todavía se está utilizando.

¿Hay algún error o falta en mi código?

¡Gracias!



¡Gracias por la respuesta!

Es un poco de bajo nivel, pero lo tendré en cuenta cuando me queden sin ideas. De todos modos, descubrí un poco más sobre el error. El documento particular que causa la excepción tiene imágenes insertadas en ellos. Cuando elimino las imágenes, la excepción no ocurre. Esto podría ser un error de DocumentViewer tal vez, pero todavía estoy intentando ...


Haga de xpsDocument un miembro, luego no llame a close () en él :)


No, hasta ahora todavía nada.

Solo para enumerar, probé los siguientes métodos que fallaron:

  1. Configure todo para anular en el evento "Cerrado" de la ventana antes de eliminar el archivo. Esto incluye la propiedad DocumentViewer.Document y el objeto DocumentViewer.

  2. Usó ShowDialog () para abrir la ventana y configurarla como nula después. Se movió la eliminación del archivo al evento "Salir" del objeto System.Windows.Application que está abriendo la ventana. Aún arroja la excepción de que el archivo está siendo utilizado.

¿Error de DocumentViewer?



Debe cerrar System.IO.Packaging.Package desde el que se abrió el XpsDocument asignado al visor. Además, si desea poder volver a abrir el mismo archivo dentro de la misma sesión de la aplicación, deberá eliminar el Paquete de la Tienda de paquetes.

Tratar

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);

Sí, sé que probablemente no haya abierto el XpsDocument con un paquete y que ni siquiera sepa cuál es, o que le importe, pero .NET lo hizo "por" detrás de escena y se olvida de limpiarlo solo.