Freigeben über


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!