1、什麼是文件屬性
文件屬性可以用來指示項目系統對應文件執行的操作。具體的操作見下文。Visual Basic和Visual C#的文件都具有4個屬性:“FileName"、“BuildAcition”、“CustomTool”、”CustomToolNamespace“。
2、CopyToOutputDirectory屬性
此屬性指定將選定的源文件復制到輸出目錄所依據的條件。如果從不將文件復制到輸出目錄,請選擇“不復制”;如果總是將文件復制到輸出目錄,請選擇“始終復制”;如果僅當文件比輸出目錄中同名的現有文件新時才復制此文件,請選擇“更新則復制”。
3、BuildAction屬性
None:不在項目輸出組中包含該文件,並且在生成進程中不會對其進行編譯。例如包含文檔的文本文件,如自述文件。
Compile:將該文件編譯到生成輸出中。此設置用於代碼文件。
Content:不編譯該文件,但將其包含在“內容”(Content)輸出組中。例如,此設置是 .htm或其他類型 Web文件的默認值。
Embedded Resource:將該文件作為 DLL或可執行文件嵌入主項目生成輸出中。此設置通常用於資源文件。
ApplicationDefinition:和Page類似,但只用於Silverlight的啟動頁面(默認是App.xaml)。
Page:Silverlight中所有的usercontrol/page/childwindowxaml都屬於”Page”build,其他的buildaction不能將build action不能將codebehind文件和Xaml文件連接起來。
CodeAnalysisDictionary:自定義的CodeAnalysis字典。
Resource:embedsthe file in a shared (by all files in the assembly with similar setting)assembly manifest resource named AppName.g.resources
SplashScreen:Silverlight的歡迎界面。
DesignData:Sampledata types will be created as faux types. Use this Build Action when the sampledata types are not creatable or have read-only properties that you want todefined sample data values for.
DesignDataWithDesignTimeCreatableTypes:Sampledata types will be created using the types defined in the sample data file. Usethis Build Aciton when the sample data types are creatable using their defaultempty constructor.
EntityDeploy:適用於Entity框架。
注意:當在資源編輯器中添加了圖像時,它會將”生成操作”設置為“無”,這是因為.resx文件會引用該圖像文件。在生成時,該圖像會被拖入到從.resx文件創建的.resources文件中。然後可以通過為.resx文件自動生成的強類型類輕松的訪問該圖像。因此,不應該將此設置更改為”嵌入的資源”,因為這樣做的話會在程序集中包含圖像兩次。
關於資源文件的使用,下文有介紹。
4、FileName屬性
通過在“屬性”窗口中單擊“FileName”屬性,然後鍵入新名稱,可以重命名文件。請注意,如果更改文件的名稱,則Visual
Studio 將自動重命名與之關聯的任何 .vb或
.resx文件。
5、CustomTool屬性
自定義工具是可用於在設計時將文件從一種類型轉換為另一種類型的組件。例如,自定義工具可以是一個數據集代碼生成器,它在一個
XML 架構 (.xsd)文件中讀取,在以編程方式公開其表和列的代碼文件中生成類。產品中有一個預定義的可用自定義工具列表;此屬性使您能夠了解哪一個自定義工具適用於某一文件。在極少的情況下,可能需要更改此屬性的值。此屬性的值必須為空白或內置自定義工具之一。
若要設置或更改自定義工具,請單擊“屬性”窗口中的“CustomTool”屬性,然後鍵入自定義工具的名稱。
6、CustomToolNamespaces屬性
如果已經將某自定義工具分配到項目,則“CustomToolNamespace”屬性將允許您指定一個命名空間,用於分配給自定義工具生成的代碼。當為
CustomToolNamespace 屬性指定一個值時,自定義工具生成的代碼將被放入指定的命名空間中。如果此屬性為空,則生成的代碼將被放入轉換後的文件所在文件夾的默認命名空間中;對於 Visual Basic,它是項目的根命名空間,對於
Visual C#,它對應於該文件夾的“DefaultNamespace”屬性的設置。
二、資源文件的使用
1、什麼是資源文件
資源文件通常是應用程序使用的任意非可執行的數據文件,如圖像、音頻和視頻文件。資源文件在某些上下文中還可能具有特定的含義。例如,在應用程序本地化的上下文中,資源文件指代
.resx文件,您可以在本地化的附屬程序集中部署這些文件。
一般通過統一資源標識符(URI)在代碼或
XAML中引用資源文件。所需的
URI格式取決於部署文件的方式。您還可以選擇指定相對或絕對
URI。
補充:什麼是相對和絕對URI?
a)相對URI指定相對於應用程序根或引用XAML的資源文件位置。例如,"http://www.example.com/resources/picture.png"表示指定域中資源文件夾中的一個文件。如果資源文件所在的域不是應用程序包的宿主域,必須指定絕對 URI。
b)絕對URI是指定資源文件的確切位置,繞過回退機制。
補充:什麼是相對於應用程序根、相對於引用XAML和指向其他程序集的URI?
應用程序根是應用程序包的根文件夾或服務器上應用程序包的位置。 相對 URI回退機制首先搜索應用程序包,然後搜索服務器。 如果在前導斜槓後包括路徑,則在這兩個位置中搜索相同的文件夾層次結構。
如果引用 XAML位於文件夾中,可以引用相對於該位置的其他文件夾中的文件。 但是,不能在應用程序根上進行搜索,例如"../resources/image.png"。 此 URI搜索包含 XAML的文件夾所在級別上的資源文件夾,假定該文件夾不是應用程序根。
如果從應用程序包加載引用 XAML但是未找到引用的資源文件,則使用默認回退機制。
應用程序包中引用 XAML的路徑用於在服務器上搜索。 例如,考慮應用程序包中以下位置的
XAML文件:/pages/xaml/MyPage.xaml。
在這種情況下,回退機制將在服務器上的以下位置搜索"../resources/image.png":/pages/resources/image.png。
如果將引用 XAML編譯為程序集,則必須在該同一程序集中嵌入資源文件。 在這種情況下,URI回退機制由ResourceManager類提供。 此回退機制使用語言和區域性設置來查找附屬程序集中的資源文件。
c)還可以引用嵌入某程序集的資源文件,該程序集不是包含引用 XAML 的程序集。 在這種情況下,URI使用以下格式:"/assemblyShortName;component/resourceLocation, 例如"/SilverlightLibraryAssembly;component/image.png"。 請注意,需要使用前導斜槓和component關鍵字(後跟一個斜槓)。
對於其他嵌入的資源,此 URI格式使用ResourceManager類提供的回退機制。
2、資源文件的類型
System.Resources命名空間支持3種資源文件:
.txt文件,只能有字符串資源。因為不能被嵌入到
Assembly中,所以很容易暴露,被客戶修改。最大缺點是僅支持字符串資源,所以不推薦使用。
.resx文件,由 XML組成,可以加入任何資源,包括二進制。同樣不能被嵌入到
Assembly 中。在 System.Resources名字空間中有專用讀寫的類。VS.NET創建這種文件然後將其轉成 .resources文件並根據設置將其嵌入到 Assembly中。
.resources文件,PE格式,可以加入任何資源。唯一可以被嵌入到
Assembly 的文件,在 System.Resources名字空間中有專用讀寫的類。
3、如何配置資源文件
在 Visual Studio中,可以將資源文件添加到 Silverlight項目並通過設置其"生成操作"值來為部署配置這些資源文件。 可以為 Silverlight項目中的資源文件使用以下生成操作:
注意:在Visual Studio中的“屬性”窗口提供了“生成操作”下拉列表的其它幾個值。但是當要應用到Silverlight項目時, 只能選擇前3項。Silverlight嵌入資源比如始終使用“資源”生成操作,而非“嵌入的資源”生成操作,這是因為後者使用了Silverlight無法識別的格式。
三、在實戰中掌握資源文件的用法
在XAML中給Button空間添加背景圖片想必都是知道的,下面我們來看看如何在後台給Button添加背景圖片。我們新建一個WPF工程,在XAML中添加好Button空間後,雙擊來處理click事件。
private void btn15_Click(object sender, RoutedEventArgs e) { ImageBrush ib = new ImageBrush(); ib.ImageSource = new BitmapImage(new Uri(@"Images/1.jpg", UriKind.Relative)); btn.Background = ib; }
注意要將該圖片設置成Content(內容)。
但如果將最後編譯得到的exe文件復制到其他位置後打開,便不再加載出圖片,這時我們需要將圖片添加到資源文件中。
雙擊添加的資源文件,選擇要添加的文件類型,另外有”添加現有文件“等選擇。
添加完成後會出現以下式樣。
回到後台代碼中。由於資源文件中是Bitmap類型,需要對其進行轉換。
public static BitmapSource ChangeBitmapToBitmapSource(Bitmap bmp) { BitmapSource returnSource; try { returnSource = Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } catch { returnSource = null; } return returnSource; }
轉換之後直接添加到Button的Background屬性即可。
private void btn_Click(object sender, RoutedEventArgs e) { var img2 = Game.Resource1._2; btn.Background = new ImageBrush(ChangeBitmapToBitmapSource(img2)); }
Ok,本篇博客到此為止了,非常感謝Aran的指導。