Caching StockIcons for Windows Presentation Framework…


Here is what I’ve added to the code to handle the BitmapSource cache and hopefully (yes, I have sined by not measuring anything, before or after) improve performance:



using BitmapSourceDictionary = System.Collections.Generic.Dictionary<int, System.Windows.Media.Imaging.BitmapSource>;


 


namespace VistaBridge.UI {


   public class StockIcon : MarkupExtension {



      static BitmapSourceDictionary _cache;


 


      static StockIcon() {


         _cache = new BitmapSourceDictionary();


      }


 


      public override int GetHashCode() {


         return ComputeUniqueValue( _identifier, _flags);


      }


 


      static int ComputeUniqueValue(StockIconIdentifier identifier, StockIconOptions flags) {


         int value = checked(((int) identifier) << 4);


         if ( (flags & StockIconOptions.Selected) == StockIconOptions.Selected)


            value += 8;


         if ( (flags & StockIconOptions.Small) == StockIconOptions.Small)


            value += 4;


         if ( (flags & StockIconOptions.LinkOverlay) == StockIconOptions.LinkOverlay)


            value += 2;


         if ( (flags & StockIconOptions.ShellSize) == StockIconOptions.ShellSize)


            value += 1;


         return value;


      }


 


      protected internal static BitmapSource GetBitmapSource(StockIconIdentifier identifier, StockIconOptions flags) {


         BitmapSource bitmapSource;


         int uniqueValue = ComputeUniqueValue(identifier, flags);


         if (!_cache.TryGetValue(uniqueValue, out bitmapSource)) {


            bitmapSource = (BitmapSource) InteropHelper.MakeImage(identifier, StockIconOptions.Handle | flags);


            bitmapSource.Freeze();


            _cache[uniqueValue] = bitmapSource;


         } else {


            System.Diagnostics.Debug.WriteLine(“Found the BitmapSource for “ + identifier.ToString() + ” in the cache!”);


         }


         return bitmapSource;


      }


 


Comments are welcomed!


 

Comments (0)