2009-09-18 6 views
12

내 Wpf 응용 프로그램에서 이미지 원본을 설정하는 데 문제가 있습니다.Wpf - 상대 이미지 원본 경로

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

지금, 내 개체의 SourceUri 속성에 설정 해야할지 모르겠어 : 나는 소스가 다음과 같이 DataContext를 객체의 SourceUri 속성에 바인딩 된 이미지가 있습니다. 완벽한 절대 경로 ("c : /etc/image.jpg")를 설정하면 멋지게 표시되지만 분명히 상대 경로를 설정하려고합니다. 내 이미지는 내 응용 프로그램 폴더와 같은 폴더에있는 Resources 폴더에 저장됩니다. 결국 이러한 이미지는 어디서나 올 수 있으므로 프로젝트에 추가하는 것은 실제로 선택 사항이 아닙니다.

나는 작업 경로 (debug-folder)에 상대적인 응용 프로그램 폴더에 상대적인 경로를 시도했습니다. 또한 행운없이 "pack : // .."문법을 사용하여 시도했지만, 어떤 일도하지 않을 것이라고 읽습니다.

내가 시도해야 할 힌트가 있습니까?

답변

9

아마도 DataContext 개체의 SourceUri 속성을 조금 더 명확하게 만들고 응용 프로그램 폴더가 무엇인지 확인한 다음이를 기반으로 절대 경로를 반환 할 수 있습니다. 예를 들어 :

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

물론 - 작품 - 들으을! 응용 프로그램 폴더를 찾을 수있는 좋은 방법을 찾을 수 없습니다, 그래서 조금 해피 순간에 느낀다 .Net에서 GetApplicationFolder() 있나요? 하나를 찾을 수 없습니다 ..하지만 상대 경로 참조 어떻게 든 작동하지 않아야합니까? 그리고 나서 이들은 응용 프로그램 루트 폴더에 상대적입니까? 아니? – stiank81

+1

Path.GetDirectoryName (Assembly.GetExecutingAssembly()를 시도하십시오.위치); –

+0

그게 내가 사용하는 것과 같은 "Path.GetFullPath (". "),하지만 후자는 작업 폴더에 따라 달라질 것 같아요. 그래서 제안과 함께.이 문제를 좀 더있어,하지만 나는 그것을 알아낼 것입니다. Thx 당신의주의를 위해! – stiank81

3

있는 Environment.CurrentDirectory는 (-하지만 우리가 어디 있는지 이미 알고 있다고 가정 할 수는 수동으로 .CurrentDirectory을 설정하지 않는 것입니다) 당신에게 .EXE이 저장된 폴더를 표시합니다. 또는 무엇이든 전체 경로는 다음과 같습니다

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

이 '\ 폴더 \ MoreFolders이 자료 \ image.jpg를 \ C는'반환해야합니다 :

17

이 도움을 줄 수 System.IO.Path의 편리한 방법이있다 귀하의 맥락에서. 현재 작업 폴더를 시작점으로 사용합니다.

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

건배,

세르지오