2009-09-16 1 views
2

WPF에서 상대 파일 경로를 BitmapImage으로 변환하는 IValueConverter이 있습니다.링크로 프로젝트에 추가 된 이미지 파일을 소비하려고 할 때 IOException이 발생하는 이유는 무엇입니까?

강령 :

public class RelativeImagePathToImage : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var relativePath = (string)value; 
     if (string.IsNullOrEmpty(relativePath)) return Binding.DoNothing; 
     var path = "pack://application:,,,/" + value; 
     var uri = new Uri(path); 
     return new BitmapImage(uri); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Binding.DoNothing; 
    } 
} 

문제점 : 나는 (링크로 프로젝트에 추가 된 파일을 사용하려고 할 때까지이 컨버터는 잘 작동했다

솔루션 탐색기 -> 기존 항목 추가 -> 링크로 추가). 이미지 파일의 BuildActionContent으로 설정되고 파일은 Copy Always으로 표시됩니다. 파일이 확실히 "bin"폴더에 제대로 복사되고 있지만 어떤 이유로 인해 변환기가 return new BitmapImage(uri)이되면 찌를 수 있습니다.

예외 :

System.IO.IOException was unhandled 
Message="Cannot locate resource 'images/splash.png'." 
Source="PresentationFramework" 

질문 :

누군가가 이것을 설명 할 수 있습니까? 이것은 .NET Framework의 버그입니까? 예상되는 동작입니까? 해결 방법이 있습니까, 아니면 이미지 콘텐츠 파일 옵션이 아닌 "링크로 추가"입니까?

편집 :

좋아, 해결 방법을 발견했다. 여기 내 수정 된 컨버터 클래스는 다음과 같습니다

public class RelativeImagePathToImage : IValueConverter 
{ 
    private static string _rootPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var relativePath = (string)value; 
     if (string.IsNullOrEmpty(relativePath)) return Binding.DoNothing; 
     var path = _rootPath + "/" + relativePath; 
     var uri = new Uri(path); 
     return new BitmapImage(uri); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Binding.DoNothing; 
    } 
} 

은 분명히, 링크 된 파일이있는 packuri를 사용에 문제의 어떤 종류가있다. 하지만 왜?

답변

2

대답은 pack://siteoforigin:,,,/보다는 pack://application:,,,/ 사용하는 것입니다.

pack://siteoforigin은 파일이 링크 또는 정상적으로 프로젝트에 추가되었는지 여부에 관계없이 bin/Debug 또는 bin/Release 폴더 (또는 하위 폴더)에 복사 된 모든 콘텐츠 파일에서 작동합니다.

path://application은 (안 링크로) 일반적으로 추가되는 콘텐츠 파일에 적용됩니다.

1

팩 : // URI 스킴은 그냥 파일을 추가하거나 링크로 파일을 추가하고 "내용"그것은 단지에서 파일을 복사합니다 자사의 유형을 설정하면 다른 리소스 디렉토리, 내부 파일을 사용하여 bin 폴더에 있지만 응용 프로그램 자원 디렉토리에는 압축되지 않습니다.

개별 파일과 디렉토리에 존재하는 파일에 대한 그래서, 당신은 팩 URI 방식을 사용할 수 없습니다, 당신은 정상 경로 파일 URI 방식을 사용해야합니다. 이 동작은 파일이 링크로 추가되거나 복사되는 경우 종속되지 않으며 파일을 내보내는 방법에 따라 다릅니다.

+0

그러나 코드는 폴더에있는 이미지 파일에 대해 잘 작동하고'Content' -'Copy Always'로 설정됩니다. 폴더에 파일을 저장하는 대신 링크를 사용했을 때만 작동이 멈췄습니다. – devuxer

+0

+1, 내 사건을 해결하기위한 힌트로 충분했다. 한 프로젝트 폴더의 깊은 파일 = 잘 작동했다. 2 개의 프로젝트 폴더 deep = 예외. 어리석은. –

관련 문제