Wpf - relative image source path Wpf - relative image source path wpf wpf

Wpf - relative image source path


There's a handy method in System.IO.Path which can help with this:

return Path.GetFullPath("Resources/image.jpg");

This should return 'C:\Folders\MoreFolders\Resources\image.jpg' or whatever the full path is in your context. It will use the current working folder as the starting point.

Link to MSDN documentation on GetFullPath.


Perhaps you could make the SourceUri property of your DataContext object a bit cleverer, and determine what the application folder is, and return an absolute path based on that. For example:

public string SourceUri{    get    {        return Path.Combine(GetApplicationFolder(), "Resources/image.jpg");    }}


After some frustrating times trying with

 <Image Source="pack://application:,,,/{Binding ChannelInfo/ChannelImage}">

and

 <Image Source="pack://siteoforigin:,,,/{Binding ChannelInfo/ChannelImage}">

and

 <Image Source="/{Binding ChannelInfo/ChannelImage}">

I solved this implementing my own converter:

C# side:

public class MyImageConverter : IValueConverter{    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)    {        string path= (string)value;        try        {            //ABSOLUTE            if (path.Length > 0 && path[0] == System.IO.Path.DirectorySeparatorChar                || path.Length > 1 && path[1] == System.IO.Path.VolumeSeparatorChar)                return new BitmapImage(new Uri(path));            //RELATIVE            return new BitmapImage(new Uri(System.IO.Directory.GetCurrentDirectory() + System.IO.Path.DirectorySeparatorChar + path));        }        catch (Exception)        {            return new BitmapImage();        }    }    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)    {        throw new NotImplementedException();    }}

XAML side:

<UserControl.Resources>    <local:ImageConverter x:Key="MyImageConverter" />    (...)</UserControl.Resources><Image Source="{Binding Products/Image, Converter={StaticResource MyImageConverter}}">

Cheers,

Sérgio