parser - scraping with c#
Usa imágenes locales en el control Webbrowser (4)
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.
Puse 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 suposición es que debería ser algo como esto:
<img src="/SilverlightApplication;component/photo.jpg"/>
"SilverlightApplication" y "component" deberían ser reemplazados por otra cosa, pero no sé qué :(
Este es un hilo muy antiguo, pero he encontrado una solución, ya que hoy hemos actualizado una aplicación WP7.
El secreto es convertir la imagen a una representación base 64 primero, así que comience 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, donde quieras inyectar una imagen en el código (los míos son gifs) usa esto
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);
así que puede utilizar imágenes dinámicas por concatenación de la aplicación de ejemplo dada Paul arriba actualizar la matriz de forma dinámica,
string[] files = {
"readme.htm", "desert.jpg", "sample.jpg"
};
y antes de escribir a aislado puede eliminar el 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();
}
}
Deberá almacenar sus imágenes en el Almacenamiento aislado y luego visualizar las imágenes desde allí. He creado una muestra que puede descargar desde la siguiente ubicación:
www.smartmobiledevice.co.uk/projects/webbrowserimagesample.zip
Esto se basa en el artículo de MSDN Cómo: mostrar contenido web estático usando el control WebBrowser para Windows Phone .
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. Entonces, la URL absoluta de un archivo en IsoStorage sería:
string URL = "file://" +
Windows.Storage.ApplicationData.Current.LocalFolder.Path +
"//folder//filename.png";
El control WebBrowser toma dichas URL en un NavigateToString()
''d HTML bien. O puede designar IsoStorage como base y usar URL relativas en todo. isostore:
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 para los recursos de su aplicación. Eso sería Windows.ApplicationModel.Package.Current.InstalledLocation.Path
.