Подтвердить что ты не робот

Wpf - путь источника исходного изображения

У меня возникают проблемы с установкой источника изображений в приложении Wpf. У меня есть изображение, где источник привязан к свойству SourceUri объекта DataContext, например:

<Image Source="{Binding SourceUri}"></Image>

Теперь я не знаю, что установить в свойстве SourceUri моего объекта. Установка полного абсолютного пути ( "c:/etc/image.jpg" ) отображается хорошо, но, очевидно, я хочу установить относительный путь. Мои изображения хранятся в папке Ресурсы, которая находится в той же папке, что и папка моего приложения. В конце концов, эти изображения могут появляться откуда угодно, поэтому их добавление в проект действительно не вариант.

Я пробовал путь относительно папки приложения и относительно рабочего пути (папка отладки). Также попробовал использовать синтаксис "pack://.." без везения, но прочитал, что это не будет делать ничего.

Любые намеки на то, что я должен попробовать?

4b9b3361

Ответ 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, но тогда мы можем предположить, что вы уже знаете, где это).