2010-02-06 6 views
7

Nel mio progetto WPF ho bisogno di rendere il contenuto basato su HTML, dove il contenuto è memorizzato in un assieme di risorse a cui fa riferimento il mio progetto WPF.WPF: Visualizza contenuto basato su HTML memorizzato nell'assieme di risorse

Ho esaminato i controlli WPF Frame e WebBrowser. Sfortunatamente, entrambi espongono solo eventi di navigazione (Navigazione, Navigazione), ma non tutti gli eventi che mi consentirebbero, in base all'URL richiesto, di restituire il contenuto HTML recuperato dall'assieme di risorse.

Posso intercettare le richieste di navigazione e servire contenuti HTML utilizzando l'evento Navigating e il metodo NavigateToString(). Ma questo non funziona per intercettare chiamate di caricamento per immagini, file CSS, ecc.

Inoltre, sono a conoscenza di uno HTML to Flowdocument SDK sample application che potrebbe essere utile, ma probabilmente dovrei estendere il campione considerevolmente per gestire le immagini e fogli di stile.

Per quello che vale, generiamo anche il contenuto HTML da renderizzare (tramite pagine Wiki) in modo che l'HTML sorgente sia in qualche modo prevedibile (ad esempio, forse non JavaScript) in termini di posizioni di immagini di riferimento e fogli di stile CSS utilizzati. Stiamo cercando di visualizzare contenuti HTML casuali da internet.

Aggiornamento: C'è anche la possibilità di creare un file MHT per ogni pagina HTML, che sarebbero 'inline' tutte le immagini come tipi MIME e alleviare la necessità di avere callback grana più fine.

risposta

3

Se stai bene con una DLL da 28 megabyte, puoi dare un'occhiata a BerkeliumSharp, che è un involucro gestito attorno alla fantastica libreria Berkelium. Berkelium utilizza al suo interno il browser chromium per fornire il rendering offscreen e un modello di eventi delegato. Ci sono tantissime cose interessanti che puoi fare con questo, ma per il tuo problema particolare, in Berkelium c'è un'interfaccia chiamata ProtocolHandler. Lo scopo di un gestore di protocollo è quello di prendere un URL e fornire le intestazioni e il corpo HTTP al motore di rendering sottostante.

Nell'app di prova BerkeliumSharp (uno dei progetti disponibili nell'origine), è possibile vedere un particolare utilizzo di questo è il FileProtocolHandler - gestisce tutto il file IO per il protocollo "file: //" utilizzando. Classi gestite NET (System.IO). Potresti fare la stessa cosa per un protocollo creato come "resource: //". Non c'è davvero solo un metodo che dovete ignorare chiamato handleRequest che assomiglia a questo:

bool HandleRequest (string url, ref byte[] responseBody, ref string[] responseHeaders) 

Quindi che ci si prende un URL come "risorsa: // path/to/mio/html" e fare tutto il necessario Assemblea . GetResourceStream ecc. In quel metodo. Dovrebbe essere abbastanza facile dare un'occhiata a come FileProtocolHandler viene utilizzato per adattare il tuo.

Sia il berkelium che il berkelium sharp sono open source con una licenza BSD.

3

Il WebBrowser espone un metodo NavigateToStream(Stream) che potrebbe funzionare per voi:

Se il contenuto viene quindi memorizzato come una risorsa incorporata, è possibile utilizzare:

var browser = new WebBrowser(); 
var source = Assembly.Load("ResourceAssemblyName"); 
browser.NavigateTo(source.GetManifestResourceStream("ResourceNamespace.ResourceName")); 

V'è anche un metodo di NavigateToString(string) che si aspetta il contenuto di string del documento.

Nota: non ho mai usato questo in rabbia, quindi non ho idea di quanto aiuto sarà!

+0

Il problema con entrambi è quello che si deve fare con le cose a cui viene fatto riferimento dall'HTML (ad esempio immagini o fogli di stile). Il browser non sa da dove prenderli. –

+0

Quindi le risorse sono incorporate anche negli assiemi? Ancora una volta, non ho provato questo, ma potresti essere in grado di utilizzare URI di pacchetto (che presumibilmente devono essere iniettati nell'HTML originale) per ovviare a questo –

+0

Matt, puoi incorporare le immagini direttamente in HTML, ma i fogli di stile potrebbe essere un problema Dovrò vedere se il controllo genera richieste di caricamento (tramite eventi o delegati). –