WPF整理-二进制资源和内容

WPF中的Binary Resource(二进制资源)是相对于前面所说的Logical resource(逻辑资源)而说的,通常指Image、XML文件等。app

注意:这里说的是Resource"资源",和Content"内容"是不一样的。ide

1.Content VS Resource

通常咱们向工程中添加一个二进制的资源,如图片。咱们设置它的属性,设置成资源和内容是不一样的!ui

简单的说下二者的区别:this

When the Build Action is set to Content (as in the jellyfish example), the resource is not
included in the assembly. This makes it more appropriate when the resource needs to change
often (perhaps by a designer) and a rebuild would be undesirable. Also, if the resource is
large, and not always needed, it's better to leave it off to the resulting assembly. Note that to
access the resource, the exact same syntax is used. This is possible because WPF adds the
AssemblyAssociatedContentFile attribute to the assembly, specifying the name of the
resource file. Here's a view with .NET Reflector:”spa

“That's why we were able to replace the jellyfish image with a desert image and get it to show
correctly given the name jellyfish.jpg without doing any kind of rebuilding.” 3d

WHILErest

When the Build Action is set to Resource, the image file is stored as a resource inside the compiled
assembly. This is because the Build Action was set to Resource on the image. This makes
the actual image file unnecessary when deploying the application.
These resources are part of the assembly and are stored in a resource named
MyApplication.g.resources, where MyApplication is the name of the
assembly. Here's a snapshot from .NET Reflector:”code

2.Access

对于Image,不管设置成Content,仍是Resource,均可以很方便的访问,以下:xml

xaml中blog

<Image Source="Images/5.png" Width="100" Height="100" />
<Image Source="Images/6.png" Width="100" Height="100" />

C#中

image1.Source = new BitmapImage(new Uri("Images/5.png", UriKind.Relative));
image2.Source = new BitmapImage(new Uri("Images/6.png", UriKind.Relative));

并无区别。

 3.Point of Interest

其余的,如xml file,二者访问方法就有区别了!

“Accessing a binary resource in XAML is pretty straightforward, but this works for standard
resources such as images. Other types of resources may be used in code, and this requires
a different approach.”

譬若有这样的一个xml file

若是,咱们将生产操做设置成为Content,则咱们能够这样访问:

            var books = XElement.Load("Xml/books.xml");        var bookList = from book in books.Elements("Book")
                           orderby (string)book.Attribute("Author")
                           select new
                           {
                               Name=(string)book.Attribute("Name"),
                               Author=(string)book.Attribute("Author")
                           };
            foreach (var book in bookList)
            {
                txtBook.Text += book.ToString() + Environment.NewLine;
            }

或者是:

            var info = Application.GetContentStream(new Uri("Xml/books.xml", UriKind.Relative)); var books = XElement.Load(info.Stream);        var bookList = from book in books.Elements("Book")
                           orderby (string)book.Attribute("Author")
                           select new
                           {
                               Name=(string)book.Attribute("Name"),
                               Author=(string)book.Attribute("Author")
                           };
            foreach (var book in bookList)
            {
                txtBook.Text += book.ToString() + Environment.NewLine;
            }

若是设置成Resource,则以上程序会报告没法找到xml file。


所以,设置成Resource时,咱们应该这样访问:

            var info = Application.GetResourceStream(new Uri("Xml/books.xml", UriKind.Relative)); var books = XElement.Load(info.Stream); var bookList = from book in books.Elements("Book")
                           orderby (string)book.Attribute("Author")
                           select new
                           {
                               Name=(string)book.Attribute("Name"),
                               Author=(string)book.Attribute("Author")
                           };
            foreach (var book in bookList)
            {
                txtBook.Text += book.ToString() + Environment.NewLine;
            }

两种状况下,程序运行以下:

相关文章
相关标签/搜索