using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Data; using System.Windows.Media.Imaging; using Work; namespace _29WxOrderWpf.Converters { public class ImageUrlToBitmapImageConverter : IValueConverter { /// 缓存上限,防止大量缩略图重复下载导致内存膨胀 private const int MaxCacheCount = 200; private readonly ConcurrentDictionary _imageCache = new ConcurrentDictionary(); public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is string url && Uri.IsWellFormedUriString(url, UriKind.Absolute)) { if (_imageCache.TryGetValue(url, out BitmapImage cached)) { return cached; } try { // 直接加载绑定如果遇到有问题的网络图片会直接崩溃。 BitmapImage bitMap = AllBase.ImageBuild.LoadBitmipImageFromUrl(url); if (bitMap != null) { if (_imageCache.Count >= MaxCacheCount) { _imageCache.Clear(); } _imageCache[url] = bitMap; } return bitMap; } catch { } } return null; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); // 不需要反向转换,所以不实现。 } } }