2011-10-14 48 views
6

我的問題是:我是讀MSDN錯誤的或者是MSDN錯了嗎?我試圖通過相對URI引用圖像資源WPF絕對與相對的Pack URI

題爲的Pack URI WPF的MSDN頁中明確指出:

「在當地組裝的子文件夾中的資源文件」=/Subfolder/ResourceFile.xaml

表2:標記(這裏 http://msdn.microsoft.com/en-gb/library/aa970069.aspx)相對URI。

所以,我在VS2010(v10.0.40219.1 SP1Rel)創建新的WPF/.NET 4.0的項目進行測試。

Startup Project: TryUri 
    App.xaml 
    MainWindow.xaml 
Custom Ctrl Project: TryUri.CCL 
    Icons/folder.png <-- Marked As Resource! 
    Views/TestUC.xaml 

在TestUC.xaml:

<Canvas> 
    <Border> 
     <Image Source="/Icons/folder.png" Height="Auto" Width="Auto" /> 
    </Border> 
</Canvas> 

在MainWindow.xaml:

// xmlns:uc="clr-namespace:TryUri.CCL.Views;assembly=TryUri.CCL" 

<uc:TestUC /> 

結果:圖像顯示不出來!

當我將路徑更改爲「../Icons/folder.png」它確實有效。

如果我將圖標/ folder.png複製到TryUri.CCL/Views /文件夾中,那麼「Icons/folder.png」將起作用。

但是,我永遠不能獲得領先斜線,如「/Icons/folder.png」的方式,MSDN狀態工作。

+0

我的猜測是您的工作目錄在您的項目中設置錯誤。我會先檢查一下。 –

+0

如果我試圖以文件的形式訪問png,工作目錄很重要。我不是,它被標記爲資源。我更新了這個問題以澄清這一點。謝謝。 –

+0

我在下面自我回答。對於我的項目,我選擇簡單地使用相對於標記的路徑(即「../icons/folder.png」),因爲這是最簡單的選擇IMO。 –

回答

12

其原因,還是沒有前導反斜槓因爲URI的相對如何使用,from MSDN (emphasis mine)

絕對與相對的Pack URI

...

如果前導反斜槓被使用,然而,相對包URI引用然後考慮相對於應用程序的根。

因此,如果您希望圖像保持相對於您引用的程序集的相對位置,則只需省略前導斜槓或在子文件夾中使用../即可。

請參見下面的圖像如何,這看起來在運行時的例子:

Absolute vs. Relative Pack URIs

+0

我試過這個,它不能用一個前導斜槓工作。我必須使用「Icons/folder.png」才能工作。 –

+0

感謝您的更新。你可以評論一個鏈接到你的代碼?我很好奇你是如何得到這個工作的。另外,它看起來像是將TestUC和TestUC2.xaml留在WpfControlLibrary1的/ Views文件夾中,與您的答案相反。 –

+0

我正在修改我的答案,我相信'..'是必需的,因爲您的'UserControl'在運行時如何使用。 – user7116

4

只是你的應用程序的名稱替換<應用程序名稱>,並作爲一個單獨的程序運行的時候,你的相關包URI必須以../開始這應該工作

Source="/<ApplicationName>;component/Icons/folder.png" 
+1

謝謝。我知道這會工作,但我想知道爲什麼MSDN說我可以做「/Subfolder/Resource.file-ext」。 –

7

答案是這樣的:中的相對路徑的斜線始終解析爲主體,而不是組裝標記是在

爲了使其以MSDN的方式工作,我將不得不將所有圖標存儲在主程序集中的「圖標/」文件夾中,而不是在自定義控件dll中。

如果您選擇將資源存儲在dll程序集的「圖標/」文件夾中,則必須使用與您正在使用的標記相關的路徑(即「../Icons/folder.png」)引用它們,或者您必須符合路徑與程序集名稱(即「/AssemblyName;component/Icons/folder.png」)