当前位置: 代码迷 >> C# >> [CSharp]六 文件属性以及资源文件的使用
  详细解决方案

[CSharp]六 文件属性以及资源文件的使用

热度:229   发布时间:2016-05-05 05:02:23.0
[CSharp]6 文件属性以及资源文件的使用
一、C#文件属性

1、什么是文件属性


文件属性可以用来指示项目系统对应文件执行的操作。具体的操作见下文。Visual BasicVisual C#的文件都具有4个属性:“FileName"“BuildAcition”“CustomTool””CustomToolNamespace“ 


2CopyToOutputDirectory属性


此属性指定将选定的源文件复制到输出目录所依据的条件。如果从不将文件复制到输出目录,请选择“不复制”;如果总是将文件复制到输出目录,请选择“始终复制”;如果仅当文件比输出目录中同名的现有文件新时才复制此文件,请选择“更新则复制”。

3、BuildAction属性


None:不在项目输出组中包含该文件,并且在生成进程中不会对其进行编译。例如包含文档的文本文件,如自述文件。

Compile:将该文件编译到生成输出中。此设置用于代码文件。

Content:不编译该文件,但将其包含在“内容”(Content)输出组中。例如,此设置是 .htm或其他类型 Web文件的默认值。

Embedded Resource:将该文件作为 DLL或可执行文件嵌入主项目生成输出中。此设置通常用于资源文件。

ApplicationDefinitionPage类似,但只用于Silverlight的启动页面(默认是App.xaml)。 

PageSilverlight中所有的usercontrol/page/childwindowxaml都属于”Page”build,其他的buildaction不能将build action不能将codebehind文件和Xaml文件连接起来。

CodeAnalysisDictionary自定义的CodeAnalysis字典。

Resourceembedsthe file in a shared (by all files in the assembly with similar setting)assembly manifest resource named AppName.g.resources 

SplashScreenSilverlight的欢迎界面。

DesignDataSampledata 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. 

DesignDataWithDesignTimeCreatableTypesSampledata 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

  1. 具有前导斜杠的相对 URI表示相对于应用程序根的位置, 例如"/resources/image.png"

应用程序根是应用程序包的根文件夹或服务器上应用程序包的位置。 相对 URI回退机制首先搜索应用程序包,然后搜索服务器。 如果在前导斜杠后包括路径,则在这两个位置中搜索相同的文件夹层次结构。

  1. 不具有前导斜杠的相对 URI表示相对于引用 XAML的位置。 如果在代码中使用相对URI,则引用 XAML 是您的代码操作的 XAML

如果引用 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;}

转换之后直接添加到ButtonBackground属性即可。

private void btn_Click(object sender, RoutedEventArgs e){    var img2 = Game.Resource1._2;    btn.Background = new ImageBrush(ChangeBitmapToBitmapSource(img2));}

Ok,本篇博客到此为止了,非常感谢Aran的指导。