Although an image resource in a WPF project generates a System.Drawing.Bitmap
property in Resources.Designer.cs
, you could directly create a BitmapImage
from that resource. You only need to set the Build Action of the image file to Resource
(instead of the default None
).
If you have a file Red.jpg
in the Resources
folder of your Visual Studio Project, creating a BitmapImage
would look like shown below. It uses a WPF Pack Uri.
var uri = new Uri("pack://application:,,,/Resources/Red.jpg");
var bitmap = new BitmapImage(uri);
If you have an Image
control declared somewhere in XAML like this:
<Image x:Name="image"/>
you could simply set the Source
property of the image to your BitmapImage in code behind:
image.Source = bitmap;
In case you prefer to set the Source
property by binding you could create a string
property that returns the image URI. The string will automatically be converted to a BitmapImage
by a built-in TypeConverter
in WPF.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
ImageUri = "pack://application:,,,/Resources/Red.jpg";
}
public static readonly DependencyProperty ImageUriProperty =
DependencyProperty.Register("ImageUri", typeof(string), typeof(MainWindow));
public string ImageUri
{
get { return (string)GetValue(ImageUriProperty); }
set { SetValue(ImageUriProperty, value); }
}
}
In XAML you would bind to that property like this:
<Image Source="{Binding ImageUri}"/>
Of course you could as well declare the property to be of type ImageSource
public static readonly DependencyProperty ImageProperty =
DependencyProperty.Register("Image", typeof(ImageSource), typeof(MainWindow));
public ImageSource Image
{
get { return (ImageSource)GetValue(ImageProperty); }
set { SetValue(ImageProperty, value); }
}
and bind in the same way:
<Image Source="{Binding Image}"/>
Now you could pre-load your images and put them into the property as needed:
private ImageSource imageRed =
new BitmapImage(new Uri("pack://application:,,,/Resources/Red.jpg"));
private ImageSource imageBlue =
new BitmapImage(new Uri("pack://application:,,,/Resources/Blue.jpg"));
...
Image = imageBlue;
UPDATE: After all, your images do not need to be resources in the Visual Studio project. You could just add a project folder, put the image files into that folder and set their Build Action to Resource
. If for example you call the folder Images
, the URI would be pack://application:,,,/Images/Red.jpg
.