2009-09-18 9 views
12

Mam problemy z ustawianiem źródła obrazów w mojej aplikacji Wpf. Mam obrazu, gdy źródłem jest związany z właściwością SourceUri obiektu DataContext, tak:Wpf - ścieżka względnego źródła obrazu

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

Teraz nie wiem co ustawić na posesji SourceUri mojego obiektu. Ustawienie pełnej ścieżki bezwzględnej ("c: /etc/image.jpg") ładnie się wyświetla, ale oczywiście chcę ustawić względną ścieżkę. Moje obrazy są przechowywane w folderze Zasoby, które znajdują się w tym samym folderze co mój folder aplikacji. W końcu obrazy te mogą pochodzić z dowolnego miejsca, więc dodanie ich do projektu naprawdę nie jest możliwe.

Próbowałem już ścieżki względem folderu aplikacji i względem ścieżki roboczej (debug-folder). Próbowano również używać składni "pack: // .." bez powodzenia, ale czytałem, że to nie ma sensu.

Jakieś wskazówki dotyczące tego, co powinienem wypróbować?

Odpowiedz

9

Być może mógłbyś uczynić właściwość SourceUri twojego obiektu DataContext odrobinę sprytniejszą i określić, czym jest folder aplikacji, i na tej podstawie zwrócić bezwzględną ścieżkę. Na przykład:

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

Jasne - to działa - Thx! Nie można znaleźć dobrego sposobu na znalezienie folderu aplikacji, więc w tej chwili czujesz się trochę zjadliwy. Czy istnieje GetApplicationFolder() w .Net? Nie można znaleźć. Ale czy referencje ścieżek względnych nie działają? A te będą następnie względem folderu głównego aplikacji? Nie? – stiank81

+1

spróbuj Path.GetDirectoryName (Assembly.GetExecutingAssembly().Lokalizacja); –

+0

To daje mi to samo, co ten, którego używam, "Path.GetFullPath (". "), Ale myślę, że to ostatnie zależy od folderu roboczego.Tak idąc z twoją sugestią. Mam więcej problemów wokół tego, ale Zrozumiem to ... Dziękuję za uwagę! – stiank81

3

Environment.CurrentDirectory pokaże folder exe jest przechowywany w (czyli chyba że ręcznie ustawić .CurrentDirectory - ale wtedy możemy założyć, że już wie, gdzie to jest).

17

Jest poręczny sposób w System.IO.Path które mogą w tym pomóc:

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

ten powinien wrócić 'C: \ Folders \ MoreFolders \ Resources \ Image.jpg' lub cokolwiek pełna ścieżka jest w twoim kontekście. Użyje bieżącego folderu roboczego jako punktu wyjścia.

Link to MSDN documentation on GetFullPath.

+2

To jest świetne - nadal działa, jeśli chcę dostarczyć własną, pełną ścieżkę. – paddy

7

Po kilku frustrujących razy próbuje z

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

i

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

i

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

I rozwiązać ten realizacji własną nawróconego ER:

C# boczny:

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(); 
    } 
} 

strona XAML:

<UserControl.Resources> 
    <local:ImageConverter x:Key="MyImageConverter" /> 
    (...) 
</UserControl.Resources> 

<Image Source="{Binding Products/Image, Converter={StaticResource MyImageConverter}}"> 

Cheers,

Sérgio