2012-04-28 6 views
6

Ich verwende ein Webbrowser-Steuerelement in meiner Wp7-App, aber ich kann nicht scheinen, Bilder, die sich im App-Verzeichnis befinden, im Webbrowser.Verwenden Sie lokale Bilder in Webbrowser-Steuerelement

Ich habe einige Bilder in einem Ordner im selben Verzeichnis wie die .cs und .xaml Dateien gespeichert. Jetzt versuche ich, sie in die Webbrowser-Steuerung einzufügen, aber ich kann es nicht funktionieren lassen.

<img src="images/photo.jpg"/> 
<img src="/images/photo.jpg"/> 

Die beiden oben offensichtlich nicht funktionieren, meine Vermutung ist, dass es so etwas wie dies sein sollte:

<img src="/SilverlightApplication;component/photo.jpg"/> 

„SilverlightApplication“ und „Komponente“ sollte durch etwas anderes ersetzt werden, aber ich weiß nicht, was :(

Antwort

7

Sie benötigen, um Ihre Bilder in den isolierten Speicher zu speichern und dann von dort aus die Bilder angezeigt ich habe zusammen eine Probe stellen, die Sie unter der folgenden Adresse herunterladen können: -.

www.smartmobiledevice.co.uk/projects/webbrowserimagesample.zip

Dies basiert auf dem MSDN-Artikel How to: Display Static Web Content Using the WebBrowser Control for Windows Phone.

+0

Vielen Dank Paul! Aber ich mache eine NavigateToString-Methode auf dem Webbrowser, und habe die gesamte HTML-Seite in der Zeichenfolge. Aus irgendeinem Grund funktionieren die Bilder nicht, wenn ich es so mache. : S – MrCornholio

+0

zw. Nur die Bilder in der isolierten Story funktionieren nicht mit NavigateToString. Die Iamges, die einen absoluten Uri haben, funktionieren. – MrCornholio

+0

Sie müssen Ihre Zeichenfolge in eine Datei im isolierten Speicher zu speichern und setzen Sie die Base-Eigenschaft auf das WebBrowser-Steuerelement in das lokale Verzeichnis, in dem Sie Ihre Dateien gespeichert haben (HTML, Bilder, CSS, – MatthieuGD

0

gut Sie dynamische Bilder verwendet werden, können durch verketten die oben angegebene Paul Beispielanwendung dynamisch das Array aktualisieren,

string[] files = { 
     "readme.htm", "desert.jpg", "sample.jpg" 
    }; 

und vor zu schreiben isoliert man die bestehende

 private void SaveFilesToIsoStore() 
    { 
     //These files must match what is included in the application package, 
     //or BinaryStream.Dispose below will throw an exception. 
     string[] files = { 
     "readme.htm", "desert.jpg", "sample.jpg" 
    }; 

     IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication(); 
     if(isoStore.FileExists(files[0])) 
     { 
      isoStore.DeleteFile(files[0]); 
     } 

      foreach (string f in files) 
      { 
       StreamResourceInfo sr = Application.GetResourceStream(new Uri(f, UriKind.Relative)); 
       using (BinaryReader br = new BinaryReader(sr.Stream)) 
       { 
        byte[] data = br.ReadBytes((int)sr.Stream.Length); 
        SaveToIsoStore(f, data); 
       } 
      } 
     } 


    private void SaveToIsoStore(string fileName, byte[] data) 
    { 
     string strBaseDir = string.Empty; 
     string delimStr = "/"; 
     char[] delimiter = delimStr.ToCharArray(); 
     string[] dirsPath = fileName.Split(delimiter); 

     //Get the IsoStore. 
     IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication(); 

     //Re-create the directory structure. 
     for (int i = 0; i < dirsPath.Length - 1; i++) 
     { 
      strBaseDir = System.IO.Path.Combine(strBaseDir, dirsPath[i]); 
      isoStore.CreateDirectory(strBaseDir); 
     } 

     //Remove the existing file. 
     if (isoStore.FileExists(fileName)) 
     { 
      isoStore.DeleteFile(fileName); 
     } 

     //Write the file. 
     using (BinaryWriter bw = new BinaryWriter(isoStore.CreateFile(fileName))) 
     { 
      bw.Write(data); 
      bw.Close(); 
     } 
    } 
5

Auf löschen Windows Phone 8, wo einige WinRT-Klassen verfügbar sind, kann man einen Dateisystempfad des isolierten Speichers Ihrer App erhalten. So ist die absolute URL zu einer Datei in IsoStorage wäre:

string URL = "file://" + 
    Windows.Storage.ApplicationData.Current.LocalFolder.Path + 
    "\\folder\\filename.png"; 

Das WebBrowser-Steuerelement nimmt solche URLs in einem NavigateToString() ‚d HTML in Ordnung. Oder Sie können IsoStorage als Basis festlegen und überall relative URLs verwenden. isostore: URLs funktionieren nicht, ich habe es versucht. Weder tun ms-appx://local/.

Der Vollständigkeit halber können Sie sehr ähnlich einen Dateisystempfad zu den Ressourcen Ihrer App abrufen. Das wäre Windows.ApplicationModel.Package.Current.InstalledLocation.Path.

+0

Große Antwort. Funktioniert perfekt mit 'NavigateToString'. Vielen Dank :-) –

+0

@SevaAlekseyev WICHTIG: Die oben genannte Technik funktioniert nicht mit anderen Verzeichnissen im Speicher, die dem lokalen Ordner gleich sind, nur denen im lokalen Ordner und darunter. Beispielsweise habe ich mit der Methode Path.GetTempPath() ein Geschwisterverzeichnis für Local namens Temp erstellt. Dateien in diesem Verzeichnis waren * nicht * von einer WebBrowser-Komponente zugänglich. Durch das Kopieren in den lokalen Ordner wurde das Problem behoben. –

0

Dies ist ein sehr alter Thread, aber ich habe eine Lösung gefunden, wie wir gerade eine WP7-App aktualisiert haben.

Das Geheimnis ist, das Bild auf eine Basis 64 Darstellung ersten, so beginnt mit diesem Code zu konvertieren:

private string GetBase64(string f) 
    { 
     string ret = ""; 

     { 
      StreamResourceInfo sr = Application.GetResourceStream(new Uri(f, UriKind.Relative)); 
      using (BinaryReader br = new BinaryReader(sr.Stream)) 
      { 
       byte[] data = br.ReadBytes((int)sr.Stream.Length); 
       ret = System.Convert.ToBase64String(data); 
      } 
     } 
     return ret; 
    } 

Jetzt, wo Sie (sind Gifs Mine) verwenden, um dies ein Bild in den Code injizieren wollen

StringBuilder sb = ... // a string builder holding your webpage 
String b64 = GetBase64("assets/images/filename.gif"); 

sb.AppendFormat(@"<img src='data:image/gif;base64,{0}' /></div>", b64); 
Verwandte Themen