Я пытаюсь заполнить древовидную структуру в WPF значками файлов и папок, как это делает проводник Windows. Проблема в том, что он загружается очень медленно, потому что я использую конвертер, который просто вызывает
return Imaging.CreateBitmapSourceFromHIcon(icon.Handle, new Int32Rect(0, 0, c.Width, c.Height), BitmapSizeOptions.FromEmptyOptions());
Я предполагаю, что это создает новый значок для каждого файла / папки, которую я получаю. Я получаю изображения с расширением ManagedWinAPI
. Итак, теперь я планировал использовать словарь, который может сравнивать значки друг с другом.
Но как я могу сравнить два System.Drawing.Icon
объекта? Потому что ссылка всегда отличается (проверено). Мне не нужен пиксельный компаратор, потому что я не думаю, что это ускорит мой процесс.
Обновление
Принимая во внимание ответ @ Roy Dictus ', словарь все равно говорит мне, что в списке нет равных объектов:
Dictionary<byte[], ImageSource> data = new Dictionary<byte[], ImageSource>();
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Icon c = (Icon)value;
Bitmap bmp = c.ToBitmap();
// hash the icon
ImageConverter converter = new ImageConverter();
byte[] rawIcon = converter.ConvertTo(bmp, typeof(byte[])) as byte[];
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] hash = md5.ComputeHash(rawIcon);
ImageSource result;
data.TryGetValue(hash, out result);
if (result == null)
{
PrintByteArray(hash); // custom method, prints the same values for two folder icons
result = Imaging.CreateBitmapSourceFromHIcon(c.Handle, new Int32Rect(0, 0, c.Width, c.Height), BitmapSizeOptions.FromEmptyOptions());
data.Add(hash, result);
}
else
{
Console.WriteLine("Found equal icons");
}
return result;
}