2012-04-28 30 views
6

Estoy usando un control Webbrowser en mi aplicación Wp7, pero parece que no puedo poner imágenes que están en el directorio de la aplicación, en el navegador web.Usar imágenes locales en el control Webbrowser

He puesto algunas imágenes en una carpeta en el mismo directorio que los archivos .cs y .xaml. Ahora trato de ponerlos en el control del webbrowser, pero parece que no puedo hacer que esto funcione.

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

los dos anteriores, obviamente, no funcionan, mi conjetura es que debe ser algo como esto:

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

"SilverlightApplication" y "componente" debe ser sustituida por otra cosa, pero yo no sé qué :(

Respuesta

7

usted tendrá que almacenar las imágenes en el almacenamiento aislado y luego mostrar las imágenes a partir de ahí he reunido una muestra de que se puede descargar desde la siguiente ubicación: -.

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

Esto se basa en el artículo How to: Display Static Web Content Using the WebBrowser Control for Windows Phone de MSDN.

+0

Muchas gracias Paul! Pero hago un método NavigateToString en el Webbrowser, y tengo toda la página html en la cadena. Por alguna razón, las imágenes no funcionan si lo hago de esa manera. : S – MrCornholio

+0

por cierto. Solo las imágenes en la historia aislada no funcionan con NavigateToString. Los iamges que tienen un Uri absoluto funcionan. – MrCornholio

+0

También debe guardar la cadena en un archivo en el Almacenamiento aislado y establecer la propiedad Base en el control WebBrowser en el directorio local en el que guardó sus archivos (html, images, css, javascript) – MatthieuGD

0

tan bien puede utilizado imágenes dinámicas por concatenar la aplicación de ejemplo Paul dada anteriormente actualizar la matriz de forma dinámica,

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

y antes de escribir en aislado puede eliminar la existente

 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

En Windows Phone 8, donde algunas clases de WinRT están disponibles, uno puede obtener una ruta del sistema de archivos del almacenamiento aislado de su aplicación. Por lo que la dirección URL absoluta a un archivo en IsoStorage sería:

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

El control WebBrowser toma este tipo de URL en un NavigateToString() 'd HTML bien. O puede designar IsoStorage como base y usar URL relativas en todo. isostore: Las URL no funcionan, lo he intentado. Tampoco lo hace ms-appx://local/.

Para mayor completitud, de forma muy similar puede obtener una ruta del sistema de archivos a los recursos de su aplicación. Eso sería Windows.ApplicationModel.Package.Current.InstalledLocation.Path.

+0

Gran respuesta. Funciona perfectamente con 'NavigateToString'. Muchas gracias :-) –

+0

@SevaAlekseyev IMPORTANTE: la técnica anterior no funcionará con otros directorios en el almacenamiento que están conectados a la carpeta Local, solo aquellos en la carpeta Local y debajo. Por ejemplo, creé un directorio hermano para Local llamado Temp usando el método Path.GetTempPath(). Los archivos en ese directorio * no * eran accesibles por un componente WebBrowser. Copiarlos a la carpeta Local resolvió el problema. –

0

Este es un hilo muy antiguo, pero he encontrado una solución, ya que acabamos de actualizar hoy una aplicación WP7.

El secreto es convertir la imagen a una base 64 una representación en primer lugar, a fin de comenzar con este código:

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

Ahora, en la que desea inyectar una imagen en el código (la mía son gifs) utilizar este

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