C# Binding to Images in WPF

C# Binding to Images in WPF

To bind to in image in WPF we need to be able to convert the Path to the .PNG file (or other type) to a Bitmap, this is done via an on the fly convertor.

 <Image 
	x:Name="Img_SimpleNotification"
	Source="{Binding SimpleNotificationImagePath,Converter={StaticResource StringtoBitmapSourceConvertor}}"
	Height="100" 
	Width="100" 
	Margin="10,10,10,10">
</Image>

To make this work in the WPF XAML we must add a new namespace reference pointed at the name space where the convertor class resides.

 xmlns:CustomConvertors ="clr-namespace:UI_Catalog.Convertors"

And in addition we must also specify a resource for the convertor.

<Window.Resources>
        <ResourceDictionary>
            <CustomConvertors:StringtoBitmapSourceConvertor x:Key="StringtoBitmapSourceConvertor"></CustomConvertors:StringtoBitmapSourceConvertor>
        </ResourceDictionary>
</Window.Resources> 

The convertor takes in the image file path as a string and will return a Bitmap.

using System;
using System.Drawing;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Interop;
using System.Windows.Media.Imaging;

namespace StandardHolesUserInterface.Convertors
{
    public class StringtoBitmapSourceConvertor : IValueConverter
    {
        public object? Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null && value is string)
            {
                string Path = (string)value;
                return Imaging.CreateBitmapSourceFromHBitmap(
                                            ((Bitmap)Bitmap.FromFile(Path, true)).GetHbitmap(),
                                            IntPtr.Zero,
                                            Int32Rect.Empty,
                                            BitmapSizeOptions.FromEmptyOptions());
            }
            return null;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

Within the View Model (Data Context) we can then create a string property that is valuated by a path to a image in this case a PNG file, remembering we must implement ‘INotifyPropertyChanged’ within the View Model or within an inherited View Model Base.

string _SimpleNotificationImagePath;
public string SimpleNotificationImagePath
{
	get => _SimpleNotificationImagePath;
    set { _SimpleNotificationImagePath = value; NotifyPropertyChanged(); }
}
		
switch (warningType)
{
	case WaringType.Error:
    	SimpleNotificationImagePath = @"./Images/Error.png";
    	break;
    case WaringType.Information:
        SimpleNotificationImagePath = @"./Images/Info.png";
        break; ;
    default:
        SimpleNotificationImagePath = @"./Images/Warning.png";
        break;
}