j'ai lu votre blog, et qui m'a amené à ce (je pense beaucoup plus facile) configuration concept:
Comme vous remarqué, je réutilisé une partie de votre code que vous avez partagé, donc je vais partager le mien.
Créez un nouveau contrôle personnalisé appelé CachedImage.
public class CachedImage : Image
{
private string _imageUrl;
static CachedImage()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CachedImage), new FrameworkPropertyMetadata(typeof(CachedImage)));
}
public string ImageUrl
{
get
{
return _imageUrl;
}
set
{
if (value != _imageUrl)
{
Source = new BitmapImage(new Uri(FileCache.FromUrl(value)));
_imageUrl = value;
}
}
}
}
Ensuite je l'ai fait une classe FileCache (donc j'ai le contrôle sur la mise en cache des images non seulement)
public class FileCache
{
public static string AppCacheDirectory { get; set; }
static FileCache()
{
// default cache directory, can be changed in de app.xaml.
AppCacheDirectory = String.Format("{0}/Cache/", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
}
public static string FromUrl(string url)
{
//Check to see if the directory in AppData has been created
if (!Directory.Exists(AppCacheDirectory))
{
//Create it
Directory.CreateDirectory(AppCacheDirectory);
}
//Cast the string into a Uri so we can access the image name without regex
var uri = new Uri(url);
var localFile = String.Format("{0}{1}", AppCacheDirectory, uri.Segments[uri.Segments.Length - 1]);
if (!File.Exists(localFile))
{
HttpHelper.GetAndSaveToFile(url, localFile);
}
//The full path of the image on the local computer
return localFile;
}
}
également pour le téléchargement de contenu que j'ai fait une classe d'aide:
public class HttpHelper
{
public static byte[] Get(string url)
{
WebRequest request = HttpWebRequest.Create(url);
WebResponse response = request.GetResponse();
return response.ReadToEnd();
}
public static void GetAndSaveToFile(string url, string filename)
{
using (FileStream stream = new FileStream(filename, FileMode.Create, FileAccess.Write))
{
byte[] data = Get(url);
stream.Write(data, 0, data.Length);
}
}
}
HttpHelper utilise une extension de la classe WebResponse pour lire le résultat dans un tableau
public static class WebResponse_extension
{
public static byte[] ReadToEnd(this WebResponse webresponse)
{
Stream responseStream = webresponse.GetResponseStream();
using (MemoryStream memoryStream = new MemoryStream((int)webresponse.ContentLength))
{
responseStream.CopyTo(memoryStream);
return memoryStream.ToArray();
}
}
}
Maintenant vous l'avez terminé, permet de l'utiliser en XAML
<Grid>
<local:CachedImage ImageUrl="http://host/image.png" />
</Grid>
C'est tout, il est réutilisable et robuste. Le seul inconvénient est que l'image n'est jamais téléchargée à nouveau tant que vous n'avez pas nettoyé le répertoire de cache.
La première fois que l'image est téléchargée à partir du Web et enregistrée dans le répertoire de cache. Finalement, l'image est chargée depuis le cache et affectée à la source de la classe parente (Image). Cordialement, Jeroen van Langen.
Je ne pense pas que vous pourriez me créditer pour le code original sur lequel Jeroen construit sur? Il dit qu'il a utilisé mon code dans sa réponse. –
Mon diable, Simon. Le post de blog que vous aviez précédemment accepté n'est plus accessible et il ne s'est pas complètement enregistré que Jeroen avait en fait refaçonné votre solution originale. Je vais certainement faire les modifications et inclure votre nom aussi. :-) –
Et merci d'en faire la réponse acceptée! –