2009年9月3日 星期四

在WPF中引用被封裝的資源檔(影像)

要把影像檔封裝到WPF的執行檔或函式庫裡面很容易
請參考在C#中的封裝資源檔
並請記得將建置動作(Build Action)設成Resource
同時,依照放置位置的不同,引用方法也不同
我們將四張圖檔依照上面的方法分別放於四個位置
檔名位置
img.png直接置於該應用程式專案裡面
img_folder.png放在應用程式專案底下的folder內
img_dll.png直接置於參考的函式庫test_dll裡面
img_folder_dll.png放在參考的函式庫test_dll裡面的folder內

在XAML裡面引用的方法

<!--image at project-->
<Image Name="i1" Source=
"img.png" />

<!--image in folder at project-->
<Image Name="i2" Source=
"folder/img_folder.png" />

<!--image at dll-->
<Image Name="i3" Source=
"/test_dll;component/img_dll.png" />

<!--image in folder at dll-->
<Image Name="i4" Source=
"/test_dll;component/folder/img_folder_dll.png" />

而如果是在C#裡面引用的話(i1-i4是Image控制項物件)

/// image at project
i1.Source = new BitmapImage(new Uri(
"img.png",
UriKind.Relative));
/// image in folder at project
i2.Source = new BitmapImage(new Uri(
"folder/img_folder.png",
UriKind.Relative));
/// image at dll
i3.Source = new BitmapImage(new Uri(
"/test_dll;component/img_dll.png",
UriKind.Relative));
/// image in folder at dll
i4.Source = new BitmapImage(new Uri(
"/test_dll;component/folder/img_folder_dll.png",
UriKind.Relative));

注意使用函式庫的時候不需要加.dll
(如上面的函式庫檔名為test_dll.dll,但在使用時僅需用test_dll即可)
在這邊都採用相對路徑的寫法,如果想用絕對路徑的話

/// image at project
i1.Source = new BitmapImage(new Uri(
"pack://application:,,,/img.png"));

在這邊application的意思是本機端的路徑
因為Uri也可以使用在網路上的路徑
而且這時候就不需要特別註明是絕對路徑
預設Uri的建構會判斷為絕對路徑

另外,需要注意的地方是
即使你是在函式庫中使用被封裝在自己函式庫中的資源
還是必須採用放在函式庫中的寫法
這樣真正執行那段程式碼的應用程式才有辦法識別

還有,如果是設定ImageBrush時,可能因為ImageBrush的ImageSource會在使用到的時候才會去解析Uri
所以需要寫絕對路徑,相對路徑會解析錯誤

--
參考資料
Windows Presentation Foundation 中的 Pack URI
WPF 封裝 圖片resource的問題 c#
Resources in WPF – I (Binary Resources)
Image Resources in WinForms and WPF

沒有留言:

張貼留言