2009-09-18 4 views
12

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

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

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

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

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

ответ

9

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

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

Конечно - это работает - Thx! Не удалось найти хороший способ найти папку приложения, хотя в данный момент это немного взломано. Есть ли в GetNet GetApplicationFolder() .Net? Не удалось найти его. Но не должны ли относительные ссылки на пути работать как-то? И они будут относиться к корневой папке приложения? Нет? – stiank81

+1

try Path.GetDirectoryName (Assembly.GetExecutingAssembly().Место нахождения); –

+0

Это дает мне то же самое, что и тот, который я использую, «Path.GetFullPath («. »), Но, я думаю, последнее зависит от рабочей папки. Поэтому, исходя из вашего предложения, у меня появилось еще несколько проблем, но Я пойму это .. Thx для вашего внимания! – stiank81

3

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

17

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

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

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

Link to MSDN documentation on GetFullPath.

+2

Это замечательно - он по-прежнему работает, если я хочу предоставить свой собственный полный путь. – paddy

7

Спустя несколько расстраивает раз пытается с

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

Cheers,

Сержио

Смежные вопросы