Wpf - относительный путь к источнику изображения - PullRequest
14 голосов
/ 18 сентября 2009

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

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

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

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

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

Ответы [ 4 ]

17 голосов
/ 27 июля 2010

В System.IO.Path есть удобный метод, который может помочь с этим:

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

Это должно вернуть 'C: \ Folders \ MoreFolders \ Resources \ image.jpg' или любой другой полный путь в вашем контексте. В качестве отправной точки будет использоваться текущая рабочая папка.

Ссылка на документацию MSDN в GetFullPath.

10 голосов
/ 18 сентября 2009

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

public string SourceUri
{
    get
    {
        return Path.Combine(GetApplicationFolder(), "Resources/image.jpg");
    }
}
7 голосов
/ 26 августа 2011

После нескольких неудачных попыток с

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

и

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

и

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

Я решил это, реализовав свой собственный конвертер:

C # сторона:

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}}">

Приветствия,

Сержио

3 голосов
/ 13 апреля 2010

Environment.CurrentDirectory покажет вам папку, в которой хранится .exe (то есть, если вы вручную не установите .CurrentDirectory - но тогда мы можем предположить, что вы уже знаете, где он находится).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...