WPF Binding an Image using XAML and MVVM

A post describing how to bind an image such as a bitmap or png file to your viewmodel. In Visual Studio create a new WPF project: mvvm2 Observe that this creates the initial default XAML for the main window as shown: MainWindow.xaml [code language="xml"] <Window x:Class="MVVM.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> </Grid> </Window> [/code] Which when running the program produces the following blank window: Initial Window mvvm1 Now we need to add the ViewModel class, as is used in the Model-View ViewModel pattern. In Visual Studio add a new class representing the ViewModel for our main window XAML and call it MainWindowViewModel.cs: mvvm3 And configure the code so we have a property for returning the bitmap image in a format that is suitable for our WPF. Also in this class is a static method for converting a general bitmap format into a BitmapSource type: [code language="csharp"] using System; using System.Drawing.Imaging; using System.Drawing; using System.Windows.Media.Imaging; using System.Windows; namespace MVVM { public static class BitmapConversion { public static BitmapSource BitmapToBitmapSource(Bitmap source) { return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( source.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } } public class MainWindowViewModel { private BitmapSource _bitmapSource; public MainWindowViewModel() { Bitmap bitmap = (Bitmap) Bitmap.FromFile(@"c:\dump\bulb.png", true); _bitmapSource = BitmapConversion.BitmapToBitmapSource(bitmap); } public BitmapSource ButtonSource { get { return _bitmapSource; } } } } [/code] If you have trouble compiling the source make sure all the references are installed, particularly System.Drawing: mvvm4 And of course be sure that your program is able to find the location of the image file that we are binding to, in my example it is "C:\dump\bulb.png": [code language="csharp"] public MainWindowViewModel() { Bitmap bitmap = (Bitmap) Bitmap.FromFile(@"c:\dump\bulb.png", true); _bitmapSource = BitmapConversion.BitmapToBitmapSource(bitmap); } [/code] Modify the MainWindow.xaml to include the DataContext and to insert a new button containing the image we wish to bind to: [code language="xml"] <Window x:Class="MVVM.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:VM="clr-namespace:MVVM" Title="MainWindow" Height="234" Width="326"> <Window.DataContext> <VM:MainWindowViewModel /> </Window.DataContext> <Grid> <Button HorizontalAlignment="Left" Margin="35,0,0,138" VerticalAlignment="Bottom" Width="75" Height="29"> <Image Source="{Binding ButtonSource}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0"> </Image> </Button> </Grid> </Window> [/code] Compiling and running this gives the following Window, this time with button containing the XAML-bounded image: mvvm5 Download Visual Studio 2010 project from here: https://www.technical-recipes.com/Downloads/MVVM.zip

Comments

Popular posts from this blog

Using the Supervisor Controller Pattern to access View controls in MVVM

Getting started with Tesseract optical character recognition (OCR) library in Visual Studio

How to send an e-mail via Google SMTP using C#