2011-09-28 46 views
2

我使用Python Tools for Visual Studio(在VS 2010中)創建WPF項目。我添加一個圖像控件到表單。我點擊圖片的來源屬性中的「...」,然後找到一張圖片。如何使用WPF中的相對圖像源使用IronPython

這會將「Images」文件夾添加到項目中(包括文件系統和解決方案中),然後將圖像複製到該文件夾​​(同樣在文件系統和解決方案中)。圖像確實不是顯示在「添加」對話框中。 Source屬性設置爲「Images/foo.png」。

在XAML中,源代碼是帶藍色下劃線的,因爲「Build Action」未設置爲「Resource」。唯一可用的構建操作是「內容」,「編譯」和「無」。我認爲「資源」在IronPython這樣的動態語言中是不可用的(當然嵌入式資源會很複雜)。我不知道這是否是問題,或者這是否可以忽略。

圖像不會顯示在實時編輯窗口中,並且在程序運行時不會顯示。

我試過「/Images/foo.png」(建議爲here),「pack:// application:,,,/foo.png」,「pack:// application:,,,/Images /foo.png「,」pack:// siteoforigin:,,,/foo.png「和」pack:// siteoforigin:,,,/Images/foo.png「。

(該siteoforigin不起作用,因爲「出身」是ipy.exe。如果我移動圖像文件夾到IronPython的安裝,那麼這確實工作。顯然不是一個很好的解決方案的文件夾!)。

我已經嘗試將文件系統中的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

我發現處理圖像路徑的最佳方式是完全繞過冗餘的URI冗餘,並直接使用綁定直接綁定到BitmapImage。

<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