Wpf - путь источника исходного изображения
У меня возникают проблемы с установкой источника изображений в приложении Wpf. У меня есть изображение, где источник привязан к свойству SourceUri объекта DataContext, например:
<Image Source="{Binding SourceUri}"></Image>
Теперь я не знаю, что установить в свойстве SourceUri моего объекта. Установка полного абсолютного пути ( "c:/etc/image.jpg" ) отображается хорошо, но, очевидно, я хочу установить относительный путь. Мои изображения хранятся в папке Ресурсы, которая находится в той же папке, что и папка моего приложения. В конце концов, эти изображения могут появляться откуда угодно, поэтому их добавление в проект действительно не вариант.
Я пробовал путь относительно папки приложения и относительно рабочего пути (папка отладки). Также попробовал использовать синтаксис "pack://.." без везения, но прочитал, что это не будет делать ничего.
Любые намеки на то, что я должен попробовать?
Ответы
Ответ 1
Возможно, вы могли бы сделать свойство SourceUri вашего объекта DataContext более умным и определить, что такое папка приложения, и вернуть абсолютный путь на основе этого. Например:
public string SourceUri
{
get
{
return Path.Combine(GetApplicationFolder(), "Resources/image.jpg");
}
}
Ответ 2
В System.IO.Path есть удобный метод, который может помочь с этим:
return Path.GetFullPath("Resources/image.jpg");
Это должно возвращать "C:\Folders\MoreFolders\Resources\image.jpg" или все, что полный путь в вашем контексте. В качестве начальной точки будет использоваться текущая рабочая папка.
Ссылка на документацию MSDN на GetFullPath.
Ответ 3
После нескольких неудачных попыток с помощью
<Image Source="pack://application:,,,/{Binding ChannelInfo/ChannelImage}">
и
<Image Source="pack://siteoforigin:,,,/{Binding ChannelInfo/ChannelImage}">
и
<Image Source="/{Binding ChannelInfo/ChannelImage}">
Я решил реализовать свой собственный конвертер:
С# сторона:
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:
<UserControl.Resources>
<local:ImageConverter x:Key="MyImageConverter" />
(...)
</UserControl.Resources>
<Image Source="{Binding Products/Image, Converter={StaticResource MyImageConverter}}">
Приветствия,
Сержиу
Ответ 4
Environment.CurrentDirectory покажет вам папку, в которой хранится .exe(это если вы не установили вручную .CurrentDirectory, но тогда мы можем предположить, что вы уже знаете, где это).