2011-09-28 4 views
2

(VS 2010에서) Python Tools for Visual Studio을 사용하여 WPF 프로젝트를 만들고 있습니다. 양식에 이미지 컨트롤을 추가합니다. Image Source 속성에서 "..."을 클릭하고 이미지를 찾습니다.IronPython을 사용하여 WPF에서 상대 이미지 소스를 사용하는 방법

이것은 "이미지"폴더를 프로젝트 (파일 시스템과 솔루션 모두)에 추가하고 해당 이미지를 해당 폴더에 복사합니다 (다시 파일 시스템과 솔루션 모두에서). 이미지는 "추가"대화 상자에 이 아니고이 표시됩니다. 원본 속성은 "Images/foo.png"로 설정됩니다.

XAML에서 "Build Action"이 "Resource"로 설정되어 있지 않기 때문에 원본에 파란색 밑줄이 그어져 있습니다. 사용할 수있는 빌드 동작은 "콘텐츠", "컴파일"및 "없음"입니다. IronPython과 같은 동적 언어에서는 "리소스"를 사용할 수 없습니다 (물론 임베디드 리소스는 복잡 할 것입니다). 이것이 문제인지 여부 또는 무시할 수 있는지 여부는 알 수 없습니다.

이미지는 실시간 편집 창에 표시되지 않으며 프로그램 실행시 표시되지 않습니다. "팩 : // 응용 프로그램 : ,,,/이미지

나는"/Images/foo.png을 "(here를 제안),": // 응용 프로그램 ,,,/foo.png 팩 "시도했다 /foo.png ","pack : // siteoforigin : ,,,/foo.png "및"pack : // siteoforigin : ,,,/Images/foo.png "로 변경됩니다.

('origin'이 ipy.exe이므로 siteoforigin이 작동하지 않습니다.) IronPython이 설치된 폴더로 Images 폴더를 이동하면이 방법이 작동하지만 분명히 좋은 해결책은 아닙니다!).

파일 시스템에서 Images 폴더를 솔루션과 같은 폴더 (예 : 계층 구조에서 한 레벨 위로 이동)로 이동하고 이미지가 아닌 .py 파일과 같은 폴더에 이미지를 저장해 보았습니다 하위 폴더.

소스를 (XAML에서 직접) 절대 경로로 변경하면 완벽하게 작동합니다. 분명히 이것은 위대한 해결책이 아닙니다!

어떻게 이미지의 상대 경로를 사용할 수 있습니까?

답변

2

가능합니다. 실제로 소스를 BitmapImage으로 지정하고 상대 URI가 현재 디렉토리를 기본으로 사용하기 만하면됩니다. 리소스가 아닌 파일에 대한 경고를 무시하십시오. 실제로 중요하지 않습니다. 프로그램을 실행할 때 표시됩니다.

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MyWpfApplication" Height="300" Width="300"> 
    <Grid> 
     <Image> 
      <Image.Source> 
       <BitmapImage UriSource="../Relative/Path/To/Image.png" /> 
      </Image.Source> 
     </Image> 
    </Grid> 
</Window> 

나는 이것이 이미지의 기본값 변환기 때문인 것으로 생각합니다. 당신이 그들을 사용하지 않으면, 그것은 모두 잘하는 것 같습니다.

+0

이 수행 실제로 작업, 이미지가 없지만 디자이너에서 표시합니다 (응용 프로그램이 실행될 때만). –

2

이미지 경로를 처리하는 가장 좋은 방법은 그 우스운 글꼴 인 pack://을 우회하여 단순히 BitmapImage에 직접 바인딩하는 Binding을 사용하는 것입니다.

<Image Source="{Binding imgWarningYellow}" Height="50" HorizontalAlignment="Center" VerticalAlignment="Center" /> 

이 방법, 나는 망할 일을 찾아로로드하는 코드에 간단한 GetFullPath 파일 시스템 호출을 사용할 수있는 BitmapImage :

yellowbitmap = System.Windows.Media.Imaging.BitmapImage() 
yellowbitmap.BeginInit() 
yellowbitmap.UriSource = System.Uri(System.IO.Path.GetFullPath("Images\warning-yellow50.png")) 
yellowbitmap.DecodePixelHeight = 50 
try: 
    yellowbitmap.EndInit() 
except System.IO.FileNotFoundException as e: 
    print e.Message 
else: 
    self.imgWarningYellow = yellowbitmap 
+0

뭔가 잘못하고있는 것 같아요.하지만 제대로 작동하지 않을 수도 있습니다. 이 코드를 정확히 복사했습니다 (파일명 제외). wpf.LoadComponent 호출 전후의 코드로 시도했다. 프로그램이 실행되지만 이미지가 표시되지 않습니다. –

+0

이미지의 경로를 확인하십시오. GetFullPath 호출은 상대 경로를 사용하고 현재 작업 디렉터리 (시작 파일이있는 디렉터리)를 앞에 둡니다. 시작 파일은 프로그램을 시작하기 위해 실행하는 .py 파일입니다. Visual Studio에서이 파일은 녹색 " 그것에 "놀이"아이콘. – Aphex

+0

또한 마지막에 BitmapImage를'self.imgWarningYellow' 속성에 할당 한 후 바인딩을 새로 고치기 위해'INotifyPropertyChanged' 이벤트가 발생한다는 것을 언급하지 않았습니다. 내 코드에서 'self.imgWarningYellow'는 [해당 알림을 자동으로 제기하는 특별한 속성] (http://gui-at.blogspot.com/2009/11/inotifypropertychanged-in-ironpython.html)이지만 명시 적으로 그렇게해야 할 수도 있습니다. – Aphex

관련 문제