我試圖用WPF文件和文件夾的圖標填充樹狀視圖,就像Windows資源管理器一樣。問題是,這是非常緩慢的加載,因爲我使用一個轉換器,只是調用如何比較兩個System.Drawing.Icon項目
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;
}
你怎麼知道要加載哪個圖標? –
有*必須*是比使用'CreateBitmapSourceFromHIcon'更有效的訪問/轉換圖標的方法。這是爲了處理非託管圖標數據。 –
@Damien我還沒有找到,這似乎是一個把它帶到WFP ImageSource。 – Marnix