9

I can set in XAML the icon container:

<Image Source="Shell32.dll.ico" />

But how can I set in XAML the icon index in the container ? something like:

<Image Source="Shell32.dll,5" />

Or like:

<Image Source="Shell32.dll" Index="5" />

etc...

Tar
  • 8,529
  • 9
  • 56
  • 127

1 Answers1

9

This is how it goes: first the IValueConverter:

using System;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Data;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;

[ValueConversion(typeof(string), typeof(ImageSource))]
public class HabeasIcon : IValueConverter
{   
    [DllImport("shell32.dll")]
    private static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string[] fileName = ((string)parameter).Split('|');

        if (targetType != typeof(ImageSource))
            return Binding.DoNothing;

        IntPtr hIcon = ExtractIcon(Process.GetCurrentProcess().Handle, fileName[0], int.Parse(fileName[1]));

        ImageSource ret = Imaging.CreateBitmapSourceFromHIcon(hIcon, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
        return ret;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    { throw new NotImplementedException(); }
}

The XAML:

<Image Source="{Binding Converter={StaticResource iconExtractor}, ConverterParameter=c:\\Windows\\System32\\shell32.dll|72}"/>
Milack27
  • 1,619
  • 2
  • 20
  • 31
Tar
  • 8,529
  • 9
  • 56
  • 127
  • https://stackoverflow.com/questions/34351693/how-and-where-to-create-staticresource-key-for-a-converter-within-the-simple-xam – as9876 Feb 09 '23 at 21:11