<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Mgen</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/88377/rss</id><updated>2012-06-04T03:34:53Z</updated><author><name>_Mgen</name><uri>http://www.cnblogs.com/mgen/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mgen/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/88377/rss"/><entry><id>http://www.cnblogs.com/mgen/archive/2012/06/02/2532128.html</id><title type="text">[我的软件]Mgen.ResExtractor 1.0</title><summary type="text">程序和源代码下载 下载地址 注意：此为微软SkyDrive存档，请用浏览器直接下载，用某些下载工具可能无法下载 程序运行环境：.NET Framework 4.0 Client Profile 源代码环境：Microsoft Visual C# 2010 Express 程序可以将.NET中的.resources资源文件中的潜入文件按照目录释放出来。 比如一个工程中包含如下文件： 编译成功后，在Reflector下可以看到如下程序集的资源信息： 打开程序，选择程序集文件，然后选择程序集内的相应resour...</summary><published>2012-06-02T10:43:00Z</published><updated>2012-06-02T10:43:00Z</updated><author><name>_Mgen</name><uri>http://www.cnblogs.com/mgen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mgen/archive/2012/06/02/2532128.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mgen/archive/2012/06/02/2532128.html"/><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;程序和源代码下载     &lt;br /&gt;&lt;a href="https://skydrive.live.com/#cid=424A442FFE5437E9&amp;amp;id=424A442FFE5437E9%21306" target="_blank"&gt;下载地址&lt;/a&gt;      &lt;br /&gt;注意：此为微软SkyDrive存档，请用浏览器直接下载，用某些下载工具可能无法下载      &lt;br /&gt;程序运行环境：.NET Framework 4.0 Client Profile      &lt;br /&gt;源代码环境：Microsoft Visual C# 2010 Express&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;程序可以将.NET中的.resources资源文件中的潜入文件按照目录释放出来。&lt;/p&gt;  &lt;p&gt;比如一个工程中包含如下文件：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201206/201206021842589561.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201206/201206021842589528.png" width="212" height="304" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;编译成功后，在Reflector下可以看到如下程序集的资源信息：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201206/201206021842598415.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201206/20120602184259891.png" width="316" height="235" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;打开程序，选择程序集文件，然后选择程序集内的相应resources资源文件，最后开始任务（当然程序也支持直接打开.resources文件）。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201206/201206021842599778.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201206/201206021842592253.png" width="425" height="335" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;文件会被展开到指定目录下：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201206/201206021843008873.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201206/201206021843002220.png" width="228" height="159" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;原理就是使用.NET中的API来解析程序集的清单资源。更多可以参考这篇文章：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/mgen/archive/2011/12/11/2283917.html"&gt;.NET(C#)：浅谈程序集清单资源和RESX资源&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;另外程序用MVVM模式开发，MVVM新手可以参考一下程序的源代码。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mgen/aggbug/2532128.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mgen/archive/2012/06/02/2532128.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mgen/archive/2012/05/28/2521831.html</id><title type="text">在电脑中激活、获取Windows Phone和模拟器的信息</title><summary type="text">注意，源代码需要用户引用：Microsoft.Smartdevice.Connectivity.dll 对于正确安装后的Windows Phone 7的SDK，在DatastoreManager类型中查询的平台和设备应该是这样的。 === 平台 === Windows Phone 7 === 设备 === Windows Phone Device Windows Phone Emulator - 512 MB Windows Phone Emulator - 256 MB 代码是这样的： //+ using Microso...</summary><published>2012-05-28T10:14:00Z</published><updated>2012-05-28T10:14:00Z</updated><author><name>_Mgen</name><uri>http://www.cnblogs.com/mgen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mgen/archive/2012/05/28/2521831.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mgen/archive/2012/05/28/2521831.html"/><content type="html">&lt;div class="mgen_warning"&gt;   &lt;p&gt;注意，源代码需要用户引用：Microsoft.Smartdevice.Connectivity.dll&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;对于正确安装后的Windows Phone 7的SDK，在DatastoreManager类型中查询的平台和设备应该是这样的。&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;=== 平台 ===&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Windows Phone 7&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;=== 设备 ===&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Windows Phone Device&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Windows Phone Emulator - 512 MB&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Windows Phone Emulator - 256 MB&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;代码是这样的：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//+ using Microsoft.SmartDevice.Connectivity;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; mgr &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DatastoreManager&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Globalization&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #678cb1"&gt;CultureInfo&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentCulture&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LCID);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;=== 平台 ===&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;foreach&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; platform &lt;/span&gt;&lt;span style="color: #93c763"&gt;in&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; mgr&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetPlatforms())&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(platform&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;=== 设备 ===&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;foreach&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; device &lt;/span&gt;&lt;span style="color: #93c763"&gt;in&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; platform&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetDevices())&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(device&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;激活设备可以通过Device.Activate方法，不过前提是已经连接该设备，连接可以通过Connect方法。比如我们想要激活512MB的模拟器，那么代码：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//+ using Microsoft.SmartDevice.Connectivity;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; mgr &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DatastoreManager&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Globalization&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #678cb1"&gt;CultureInfo&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentCulture&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LCID);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;foreach&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; platform &lt;/span&gt;&lt;span style="color: #93c763"&gt;in&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; mgr&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetPlatforms())&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;foreach&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; device &lt;/span&gt;&lt;span style="color: #93c763"&gt;in&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; platform&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetDevices())&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;try&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//在名称中查找512字样&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;if&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (device&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Contains(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;512&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;))&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//连接&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; device&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Connect();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//激活&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; device&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Activate();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;catch&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Exception&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; e)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(e);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;OK，程序运行后，相应的Windows Phone模拟器会运行：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205281814058307.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205281814055733.png" width="496" height="234" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;另外通过Device.IsEnumator方法可以判断目标设备是否是模拟器。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;对于获取信息，可以通过Device.GetSystemInfo方法，可以查询任意Device信息，包括模拟器和实际设备。GetSystemInfo返回一个SystemInfo对象包含诸多选项信息。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;拿手机坐下测试，首先将手机连接电脑，接着打开Zune。接着调用Device.Connect连接，然后GetSystemInfo。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;完整代码：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//+ using Microsoft.SmartDevice.Connectivity;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//+ using System.ComponentModel; 用于快速输出所有属性&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;static&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;void&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; Main(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] args)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; mgr &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DatastoreManager&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Globalization&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #678cb1"&gt;CultureInfo&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentCulture&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LCID);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;foreach&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; platform &lt;/span&gt;&lt;span style="color: #93c763"&gt;in&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; mgr&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetPlatforms())&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;foreach&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; device &lt;/span&gt;&lt;span style="color: #93c763"&gt;in&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; platform&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetDevices())&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;try&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//需要Windows Phone Device这个设备，它代表连接的实际设备&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;if&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (device&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Contains(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Device&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;))&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//连接&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; device&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Connect();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//激活&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; device&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Activate();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//输出信息&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PrintProperties(device&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetSystemInfo());&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;catch&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Exception&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; e)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(e);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//快速输出所有属性&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;static&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;void&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; PrintProperties(&lt;/span&gt;&lt;span style="color: #93c763"&gt;object&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; obj)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;foreach&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #678cb1"&gt;PropertyDescriptor&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; descriptor &lt;/span&gt;&lt;span style="color: #93c763"&gt;in&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;TypeDescriptor&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetProperties(obj))&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; name &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; descriptor&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;object&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; value &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; descriptor&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetValue(obj);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;{0}: {1}&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, name, value);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;OK，结果会输出：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;OSMajor: 7&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;OSMinor: 10&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;OSBuildNo: 8107&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;ProcessorArchitecture: Arm&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;InstructionSet: Armv4ifp&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NumberOfProcessors: 1&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;     &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;……&lt;/span&gt;&lt;/p&gt;   &lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;诸多信息呵呵，比如操作系统版本：7.10.8107，处理器类型：ARM，指令集：Armv4ifp……&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mgen/aggbug/2521831.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mgen/archive/2012/05/28/2521831.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mgen/archive/2012/05/28/2520907.html</id><title type="text">.NET(C#)：methodof、fieldof和ldtoken</title><summary type="text">目录 关于运行时表示形式 使用反射Emit输出ldtoken创建methodof和fieldof Expression Tree生成的methodof和fieldof 返回目录 关于运行时表示形式 今天在Reflector中看到了methodof关键字，很显然，目前的C#没有这个关键字，但是有typeof。当然typeof、methodof和fieldof从IL上看逻辑上是没有太大区别的。 对于typeof，比如： typeof(Console) 将会被编译成： ldtoken ...</summary><published>2012-05-28T02:16:00Z</published><updated>2012-05-28T02:16:00Z</updated><author><name>_Mgen</name><uri>http://www.cnblogs.com/mgen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mgen/archive/2012/05/28/2520907.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mgen/archive/2012/05/28/2520907.html"/><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a id="_hContent"&gt;&lt;/a&gt;  &lt;div class="mgen_content"&gt;   &lt;p&gt;目录&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="#_h1"&gt;关于运行时表示形式&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="#_h2"&gt;使用反射Emit输出ldtoken创建methodof和fieldof&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="#_h3"&gt;Expression Tree生成的methodof和fieldof&lt;/a&gt; &lt;/li&gt;   &lt;/ul&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a id="_h1" href="#_hContent"&gt;返回目录&lt;/a&gt;   &lt;p&gt;&lt;strong&gt;关于运行时表示形式&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;今天在Reflector中看到了methodof关键字，很显然，目前的C#没有这个关键字，但是有typeof。当然typeof、methodof和fieldof从IL上看逻辑上是没有太大区别的。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;对于typeof，比如：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;将会被编译成：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;ldtoken [mscorlib]System.Console&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;首先通过ldtoken指令将类型在程序集内部元数据标记转换成运行时刻数据，然后调用Type.GetTypeFromHandle把RuntimeTypeHandle转换成Type，这就是typeof的功能。看了GetTypeFromHandle，还想到了什么呢？Type.TypeHandle属性返回Type的RuntimeTypeHandle。还有呢？那就是MethodBase和FieldInfo有类似的功能。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;MethodBase.MethodHandle属性和GetMethodFromHandle方法针对的是RuntimeMethodHandle，FieldInfo.FieldHandle属性和GetFieldFromHandle方法针对的是RuntimeFieldInfo，它们都和RuntimeTypeHandle一样，属于程序集元数据标记的运行时刻数据。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;并且这个ldtoken指令是完全支持属性和字段的的元数据的。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a id="_h2" href="#_hContent"&gt;返回目录&lt;/a&gt;   &lt;p&gt;&lt;strong&gt;使用反射Emit输出ldtoken创建methodof和fieldof&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;但是事实就是目前的C#只有typeof，所以可以用反射Emit使用ldtoken指令来生成一个类似methodof和fieldof的程序，程序很简单，主函数中两个本地变量，分别是MethodBase和FieldInfo类型，然后分别被赋值Console.WriteLine方法和String.Empty字段。如下完整执行代码（带注释的）：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #93c763"&gt;using&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; System;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;using&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Reflection;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;using&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Reflection&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Emit;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;namespace&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; Mgen&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;class&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Program&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;static&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;void&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; Main(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] args)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//创建AssemblyBuilder，ModuleBuilder，TypeBuilder和MethodBuilder&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; assBuilder &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AppDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentDomain&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DefineDynamicAssembly(&lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AssemblyName&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;mgen&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;), &lt;/span&gt;&lt;span style="color: #678cb1"&gt;AssemblyBuilderAccess&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;RunAndSave);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; modBuilder &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; assBuilder&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DefineDynamicModule(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;mgen&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;mgen1.exe&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; typeBuilder &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; modBuilder&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DefineType(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Program&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; methodBuilder &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; typeBuilder&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DefineMethod(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Main&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;MethodAttributes&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Static &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;|&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;MethodAttributes&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;HideBySig, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;CallingConventions&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Standard, &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Type&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;]);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//创建ILGenerator&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; ilgen &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; methodBuilder&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetILGenerator();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//类型声明&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; tfield &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FieldInfo&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; tmethod &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;MethodBase&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//生成代码中的本地变量&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; locfield &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; ilgen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DeclareLocal(tfield);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; locmethod &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; ilgen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DeclareLocal(tmethod);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//ldtoken创建String.Empty字段的运行时刻数据&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ilgen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Emit(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;OpCodes&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Ldtoken, &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;String&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetField(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Empty&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//调用FieldInfo.GetFieldFromHandle&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ilgen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Emit(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;OpCodes&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Call, tfield&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetMethod(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;GetFieldFromHandle&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Type&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] { &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;RuntimeFieldHandle&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) }));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//赋值给本地变量&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ilgen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Emit(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;OpCodes&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Stloc, locfield);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//ldtoken创建Console.WriteLine方法的运行时刻数据&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ilgen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Emit(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;OpCodes&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Ldtoken, &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetMethod(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;WriteLine&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Type&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] { }));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//调用MethodBase.GetMethodFromHandle&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ilgen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Emit(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;OpCodes&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Call, tmethod&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetMethod(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;GetMethodFromHandle&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Type&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] { &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;RuntimeMethodHandle&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;) }));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//赋值给本地变量&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ilgen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Emit(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;OpCodes&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Stloc, locmethod);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//函数终止&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ilgen&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Emit(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;OpCodes&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Ret);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//创建类型&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeBuilder&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CreateType();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//设置主函数&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; assBuilder&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;SetEntryPoint(methodBuilder, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;PEFileKinds&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WindowApplication);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; assBuilder&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Save(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;mgen1.exe&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;在Reflector中打开上述生成的程序文件：mgen1.exe，看主函数的代码：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205281015304869.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205281015304836.png" width="466" height="204" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;OK，Reflector很给力，可以智能感知到fieldof和methodof。当然再次强调一下这是目前C#语言不支持的，目前的C#语言只支持typeof。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a id="_h3" href="#_hContent"&gt;返回目录&lt;/a&gt;   &lt;p&gt;&lt;strong&gt;Expression Tree生成的methodof和fieldof&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;一个好消息就是.NET 3.5后的Expression Tree（表达式树）中生成的Lambda表达式会用到ldtoken（而不是原始反射）来获取字段和方法。这也是目前唯一可以通过C#来用到fieldof和methodof的方法了。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;首先对于字段和属性（属性实际上就是方法），通过Expression Tree中的MemberExpression对象的Member属性可以得到PropertyInfo和FieldInfo。注意MemberExpression的Member类型是MemberInfo，但是只会返回PropertyInfo和FieldInfo。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205281015313724.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205281015311739.png" width="448" height="254" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;下面代码，来试试DateTime.Now属性和String.Empty字段：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//using System.Reflection;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//using System.Linq.Expressions;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;FieldInfo&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; fieldInfo;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Func&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; exp1 &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; () &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;String&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Empty;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;fieldInfo &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FieldInfo&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)((&lt;/span&gt;&lt;span style="color: #678cb1"&gt;MemberExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)exp1&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Body)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Member;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;PropertyInfo&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; propInfo;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Func&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DateTime&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; exp2 &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; () &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DateTime&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Now;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;propInfo &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #678cb1"&gt;PropertyInfo&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)((&lt;/span&gt;&lt;span style="color: #678cb1"&gt;MemberExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)exp2&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Body)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Member;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(fieldInfo&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(propInfo&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name);&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;首先会正确输出名称，即：Empty和Now。使用Reflector反编译后的源代码：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Func&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; exp1 &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Lambda&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Func&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Field(&lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, fieldof(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Empty)), &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;ParameterExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;]);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;FieldInfo&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; fieldInfo &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FieldInfo&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)((&lt;/span&gt;&lt;span style="color: #678cb1"&gt;MemberExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)exp1&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Body)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Member;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Func&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DateTime&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; exp2 &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Lambda&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Func&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DateTime&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Property(&lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, (&lt;/span&gt;&lt;span style="color: #678cb1"&gt;MethodInfo&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)methodof(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DateTime&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;get_Now)), &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;ParameterExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;]);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;PropertyInfo&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; propInfo &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #678cb1"&gt;PropertyInfo&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)((&lt;/span&gt;&lt;span style="color: #678cb1"&gt;MemberExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)exp2&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Body)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Member;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(fieldInfo&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(propInfo&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name);&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;很简单，就是使用Expression类型的Property和Field来创建属性和字段应用的表达式，而亮点则是fieldof和methodof。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;对于方法调用的应用（不包含属性方法），则需要MethodCallExpression，它的Method属性返回一个MethodInfo（注意不是之前一直用的MethodBase父类）。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205281015311706.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205281015324704.png" width="563" height="344" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;那么代码：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//using System.Reflection;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//using System.Linq.Expressions;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Action&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; exp &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; () &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;MethodCallExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; mcExp &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #678cb1"&gt;MethodCallExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)exp&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Body;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;MethodInfo&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; methodInfo &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; mcExp&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Method;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(methodInfo&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name);&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;程序会正确输出MethodInfo的名称：WriteLine。&lt;/p&gt;  &lt;p&gt;在Reflector中浏览反编译的代码，可以看到methodof，整个反编译的代码如下：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Action&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; exp &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Lambda&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Action&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Call(&lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, (&lt;/span&gt;&lt;span style="color: #678cb1"&gt;MethodInfo&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)methodof(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine), &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;]), &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;ParameterExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;]);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;MethodCallExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; mcExp &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #678cb1"&gt;MethodCallExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)exp&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Body;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(mcExp&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Method&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name);&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;生成的Expression Tree会用Expression.Call因此返回MethodCallExpression对象。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mgen/aggbug/2520907.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mgen/archive/2012/05/28/2520907.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mgen/archive/2012/05/27/2519730.html</id><title type="text">.NET(C#)：使用Expression Tree构建带有参数、本地变量和返回值的Lambda</title><summary type="text">对于参数，需要使用Expression.Parameter创建ParameterExpression对象，注意需要在创建Lambda时传入ParameterExpression数组才可以使参数有效。 对于本地变量，首先Expression类型提供Variable方法，但是这个Variable方法返回的也是ParameterExpression，实际上他们内部创建的都是同一种ParameterExpression对象，唯一的区别是Parameter方法会考虑Type.IsByRef的情况，但是Variable会抛出异常（如果Type.IsByRef为True）。其次需要注意的是，局部变量需要在.</summary><published>2012-05-26T16:53:00Z</published><updated>2012-05-26T16:53:00Z</updated><author><name>_Mgen</name><uri>http://www.cnblogs.com/mgen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mgen/archive/2012/05/27/2519730.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mgen/archive/2012/05/27/2519730.html"/><content type="html">&lt;p&gt;对于参数，需要使用Expression.Parameter创建ParameterExpression对象，注意需要在创建Lambda时传入ParameterExpression数组才可以使参数有效。&lt;/p&gt;  &lt;p&gt;对于本地变量，首先Expression类型提供Variable方法，但是这个Variable方法返回的也是ParameterExpression，实际上他们内部创建的都是同一种ParameterExpression对象，唯一的区别是Parameter方法会考虑Type.IsByRef的情况，但是Variable会抛出异常（如果Type.IsByRef为True）。其次需要注意的是，局部变量需要在创建BlockExpression时以ParameterExpression数组的方式传入。&lt;/p&gt;  &lt;p&gt;对于返回值，需要先通过Expression.Label的部分重载创建LabelTarget对象，接着通过Expression的Return方法（间接调用MakeGoto）返回GotoExpression，注意是和一个LabelTarget对象相关联的。最后用Expression.Label的另一部分返回LabelExpression的重载创建Label表达式，也就是Label在代码块中的具体位置。最后LabelTarget对象可以按照类型标记，也可以按照类型连同名称标记。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;下面代码，我们要创建一个和如下方法类似的Lambda：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #93c763"&gt;static&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; doo(&lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; i)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; str &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; i&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ToString();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;return&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; str;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;全部代码：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//+ using System.Reflection;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//+ using System.Linq.Expressions;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//参数&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; pa &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Parameter(&lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;), &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;i&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//本地变量&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; loc &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Variable(&lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;), &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;str&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//创建LabelTarget用来返回值&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;LabelTarget&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; labelTarget &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Label(&lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//调用i.ToString()&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;MethodCallExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; med &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Call(pa, &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;object&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetMethod(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;ToString&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Type&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] { }));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//将结果赋值给本地字符串变量&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;BinaryExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; asn &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Assign(loc, med);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//创建返回表达式（实际上就是Goto表达式）&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;GotoExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; ret &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Return(labelTarget, loc);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//创建返回表达式的目标Label&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;LabelExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; lbl &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Label(labelTarget, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Constant(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;String&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Empty));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//生成BlockExpression&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;BlockExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; blocks &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Block(&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;ParameterExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] { loc },&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; asn,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; ret,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; lbl);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//生成Lambda表达式&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Func&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; lam &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Expression&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Lambda&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Func&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(blocks,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;ParameterExpression&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] { pa });&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//运行并输出结果&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Func&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; del &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; lam&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Compile();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Console&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(del(&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;17&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;));&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;输出：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;17&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://www.cnblogs.com/mgen/aggbug/2519730.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mgen/archive/2012/05/27/2519730.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mgen/archive/2012/05/20/2510768.html</id><title type="text">WPF：通过BitmapSource的CopyPixels和Create方法来切割图片</title><summary type="text">BitmapSource是WPF图像的最基本类型，它同时提供两个像素相关的方法就是CopyPixels和Create方法。使用这两个方法可以切割图片中的一部分，类似另一个BitmapSource的子类：CroppedBitmap类型。 CopyPixels方法需要提前初始化数组，同时还可以指定一个矩形（Int32Rect类型）来表示所占区域的大小。计算好图像每行所占字节数（Stride参数）和偏移量（Offset参数，通常是0）就可以正确调用CopyPixels了。接着使用填充后的数组，调用Create方法，另一个被切割的部分图像对象就生成了。 切割矩形的值代表图像像素的位置，...</summary><published>2012-05-20T12:10:00Z</published><updated>2012-05-20T12:10:00Z</updated><author><name>_Mgen</name><uri>http://www.cnblogs.com/mgen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mgen/archive/2012/05/20/2510768.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mgen/archive/2012/05/20/2510768.html"/><content type="html">&lt;p&gt;BitmapSource是WPF图像的最基本类型，它同时提供两个像素相关的方法就是CopyPixels和Create方法。使用这两个方法可以切割图片中的一部分，类似另一个BitmapSource的子类：CroppedBitmap类型。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;CopyPixels方法需要提前初始化数组，同时还可以指定一个矩形（Int32Rect类型）来表示所占区域的大小。计算好图像每行所占字节数（Stride参数）和偏移量（Offset参数，通常是0）就可以正确调用CopyPixels了。接着使用填充后的数组，调用Create方法，另一个被切割的部分图像对象就生成了。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;切割矩形的值代表图像像素的位置，比如一个200*200像素的图像，我们要四分之一部分的右上角，那么矩形的定义就是：new Int32Rect(100, 0, 100, 100);&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;最后填充数据的大小不应该是像素&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;在界面上定义两个Image控件：img1和img2&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;UniformGrid&lt;/span&gt;&lt;span style="color: #678cb1"&gt; Rows&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;Image&lt;/span&gt;&lt;span style="color: #678cb1"&gt; Name&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;img1&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;Image&lt;/span&gt;&lt;span style="color: #678cb1"&gt; Name&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;img2&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #93c763"&gt;UniformGrid&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;背后操作代码，首先读取文件并显示在img1中：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//图像路径&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; path &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #efc210"&gt;@&amp;quot;E:\Users\Mgen\Pictures\mgenx.jpg&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//创建BitmapSource&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;BitmapSource&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; bitmap &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;BitmapImage&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Uri&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(path, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;UriKind&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Absolute));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//把原图像显示在img1中&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;img1&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Source &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; bitmap;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;接下来通过CopyPixels把部分图像数据拷贝到数组中：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//定义切割矩形&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; cut &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Int32Rect&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;100&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;100&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;100&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//计算Stride&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; stride &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; bitmap&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Format&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;BitsPerPixel &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;*&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; cut&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Width &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;/&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;8&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//声明字节数组&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;byte&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[] data &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;byte&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;[cut&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Height &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;*&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; stride];&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//调用CopyPixels&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;bitmap&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CopyPixels(cut, data, stride, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;);&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;最后通过BitmapSource.Create创建BitmapSource，并显示到img2控件中：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;img2&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Source &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;BitmapSource&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Create(&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;100&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;100&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;PixelFormats&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Bgr32, &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, data, stride);&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;结果，左为原图，右为四分之一的右上角：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205202009409298.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205202009414216.png" width="393" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;当然，CopyPixels填充的数组可以任意处理，比如做反色处理：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #93c763"&gt;for&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; i &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;; i &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; data&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Length; i&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;++&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; data[i] &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #93c763"&gt;byte&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Byte&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;MaxValue &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;-&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; data[i]);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;再次运行程序：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205202009425545.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205202009424923.png" width="393" height="149" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mgen/aggbug/2510768.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mgen/archive/2012/05/20/2510768.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mgen/archive/2012/05/20/2509365.html</id><title type="text">WPF：使用RenderTargetBitmap和DrawingVisual为图片添加简单的水印</title><summary type="text">RenderTargetBitmap继承自BitmapSource类型，并且定义有Clear和Render两个重要方法，一个将图片全部设置成黑色透明，另一个将WPF中的Visual对象输出到图像中。 RenderTargetBitmap的构造函数参数都是构建位图图像的常用属性：像素大小、DpiX、DpiY和像素存储格式。对于普通图片存储，使用默认值就可以了。Dpi相关的参数用0（0代表使用默认值，而最终图片的Dpi是不可能为0的，通常默认的是96），像素存储格式用PixelFormats.Default（对应Pbgra32）。 DrawingVisual继承自Contain...</summary><published>2012-05-19T17:19:00Z</published><updated>2012-05-19T17:19:00Z</updated><author><name>_Mgen</name><uri>http://www.cnblogs.com/mgen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mgen/archive/2012/05/20/2509365.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mgen/archive/2012/05/20/2509365.html"/><content type="html">&lt;p&gt;RenderTargetBitmap继承自BitmapSource类型，并且定义有Clear和Render两个重要方法，一个将图片全部设置成黑色透明，另一个将WPF中的Visual对象输出到图像中。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/20120520011850764.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/20120520011851415.png" width="206" height="279" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;RenderTargetBitmap的构造函数参数都是构建位图图像的常用属性：像素大小、DpiX、DpiY和像素存储格式。对于普通图片存储，使用默认值就可以了。Dpi相关的参数用0（0代表使用默认值，而最终图片的Dpi是不可能为0的，通常默认的是96），像素存储格式用PixelFormats.Default（对应Pbgra32）。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;DrawingVisual继承自ContainerVisual类型，它定义了一个非常强大的方法：RrenderOpen，返回一个DrawingContext，后者类似GDI中的Device Context，通过它可以向图形终端输出图形数据。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;那么可以使用RenderTargetBitmap和DrawingVisual来做一个简单的为图片添加水印的程序。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;效果如下：&lt;/p&gt;  &lt;p&gt;原始图像：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205200118517351.jpg"&gt;&lt;img style="display: inline" title="mgenx" alt="mgenx" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205200118512334.jpg" width="128" height="128" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;程序运行后：&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205201552388657.jpg"&gt;&lt;img style="display: inline" title="mgenx" alt="mgenx" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205201552391132.jpg" width="132" height="132" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;下面程序代码，除了需要WPF中常用命名空间外，还需要读者加入如下命名空间：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #93c763"&gt;using&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Windows&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Media&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Imaging; &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//WPF图像类型&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;     &lt;p&gt;&lt;span style="color: #66747b"&gt;&lt;/span&gt;&lt;/p&gt;     &lt;span style="color: #93c763"&gt;using&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;IO;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//文件/路径相关操作&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;首先根据图像路径，读取图像文件，就是创建WPF中的图像的基础类型BitmapSource对象，接着创建RenderTargetBitmap对象，使用BitmapSource中图像的属性。最后像素类型有一个特例，必须使用PixelFormats.Default而不是BitmapSource的Format属性。因为目前RenderTargetBitmap只支持Pbgra32类型。而有时BitmapSource的Format会是Bgr32或者其他像素格式。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;代码：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//图像文件路径&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; path &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #efc210"&gt;@&amp;quot;E:\Users\Mgen\Pictures\mgenx.jpg&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//读取图像&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;BitmapSource&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; bitmap &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;BitmapImage&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Uri&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(path, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;UriKind&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Absolute));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//创建RenderTargetBitmap&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; rtbitmap &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;RenderTargetBitmap&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(bitmap&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;PixelWidth,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; bitmap&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;PixelHeight,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; bitmap&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DpiX,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; bitmap&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DpiY,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;PixelFormats&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Default);&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;接着需要构建界面元素了，因为RenderTargetBitmap的核心是将Visual输出到图像，那么此时我们就开始构建Visual了。此时使用DrawingVisual，然后通过RenderOpen方法获取DrawingContext，把图像和文字输出上去。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;首先创建FormattedText对象来做水印：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//生成FormattedText&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; text &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FormattedText&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Mgen!&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Globalization&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #678cb1"&gt;CultureInfo&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentCulture,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Windows&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #678cb1"&gt;FlowDirection&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;LeftToRight,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Typeface&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;SystemFonts&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;MessageFontFamily, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FontStyles&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Normal, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FontWeights&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Bold, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FontStretches&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Normal),&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;24&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Brushes&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;White);&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;接下来使用DrawingVisual和DrawingContext进行绘图，把图像和FormattedText输出：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//DrawingVisual和DrawingContext&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; drawingVisual &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DrawingVisual&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;using&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; dc &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; drawingVisual&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;RenderOpen())&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; dc&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DrawImage(bitmap, &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Rect&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, bitmap&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Width, bitmap&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Height));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; dc&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DrawRectangle(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Brushes&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Transparent, &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Pen&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Brushes&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;White, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;7&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;), &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Rect&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;10&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;10&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;20&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; text&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Width, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;20&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; text&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Height));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; dc&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;DrawText(text, &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Point&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ffcd22"&gt;20&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;20&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;OK，完成后，调用RenderTargetBitmap的Render方法就可以了，传入刚才的DrawingVisual对象：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//调用RenderTargetBitmap的Render&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;rtbitmap&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Render(drawingVisual);&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;最后使用BitmapDecoder把RenderTargetBitmap（也属于BitmapSource）保存至文件就可以了：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//创建Decoder&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; bitmapEncoder &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;JpegBitmapEncoder&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//加入第一帧&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;bitmapEncoder&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Frames&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Add(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;BitmapFrame&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Create(rtbitmap));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//保存至文件（不会修改源文件，将修改后的图片保存至程序目录下）&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;bitmapEncoder&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Save(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;File&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;OpenWrite(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Path&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetFileName(path)));&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://www.cnblogs.com/mgen/aggbug/2509365.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mgen/archive/2012/05/20/2509365.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mgen/archive/2012/05/16/2504230.html</id><title type="text">WPF和Silverlight：FragmentNavigation、NavigationContext和QueryString</title><summary type="text">WPF的Frame导航有一个FragmentNavigation事件。发生在当导航地址中有”#”字样，”#”后面代表着对应元素的名称。导航后目标元素会被带入到视图中，当然Page中需要手动加ScrollViewer。这个和HTML中超链接在页面中的跳转原理是一样的。 比如我们在Frame中导航至Page1.xaml中的名叫“textBlock”的元素中，代码： frame.Navigate(new Uri("/page1.xaml#textBlock", UriKind.Relative)); 程序运行后，对应元素会被切换到视图最底端： 在Fragm...</summary><published>2012-05-16T08:31:00Z</published><updated>2012-05-16T08:31:00Z</updated><author><name>_Mgen</name><uri>http://www.cnblogs.com/mgen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mgen/archive/2012/05/16/2504230.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mgen/archive/2012/05/16/2504230.html"/><content type="html">&lt;p&gt;WPF的Frame导航有一个FragmentNavigation事件。发生在当导航地址中有”#”字样，”#”后面代表着对应元素的名称。导航后目标元素会被带入到视图中，当然Page中需要手动加ScrollViewer。这个和HTML中超链接在页面中的跳转原理是一样的。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;比如我们在Frame中导航至Page1.xaml中的名叫“textBlock”的元素中，代码：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;frame&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Navigate(&lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Uri&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;/page1.xaml#textBlock&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;UriKind&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Relative));&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;程序运行后，对应元素会被切换到视图最底端：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205161630387009.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205161630383388.png" width="240" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;在FragmentNavigation事件中，通过FragmentNavigationEventArgs的Fragment属性（字符串类型）可以获取对应名称。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;在Silverlight中，不仅支持WPF有的FragmentNavigation事件。同时还支持类似HTML URL中的Query string方式。当为导航至Page的地址加入了Query string后，可以通过Page的NavigationContext类型（System.Windows.Navigation命名空间内）查询具体的数据。NavigationContext只包含一个属性：QueryString（IDictionary&amp;lt;string, string&amp;gt;类型），通过它可以按照名称查询相应的值。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;比如首先我们在Page对象的Loaded事件中枚举QueryString：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//lbx是界面上的一个ListBox，我们把QueryString显示在ListBox上。&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;lbx&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ItemsSource &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;this&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;NavigationContext&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;QueryString&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Select(i &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; i&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Key &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;:&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; i&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Value);&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;然后通过Frame的Navigate方法导航至Page，并且加入Query String：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//frame是界面上的Frame对象&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #66747b"&gt;//page1.xaml是上面代码中的Page&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;frame&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Navigate(&lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Uri&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;/page1.xaml?name=Mgen&amp;amp;gender=male&amp;amp;id=177&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;UriKind&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Relative));&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;结果：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205161630396419.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205161630391403.png" width="273" height="145" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;当然上面的都是Silverlight内Frame控件切换Page的QueryString，和浏览器中地址栏的QueryString是没有关系的，如果需要获取浏览器的QueryString，则需要使用System.Windows.Browser命名空间内的HtmlPage.Document.QueryString属性，同样返回一个IDictionary&amp;lt;string, string&amp;gt;对象供查询或者枚举。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;我们用同样的方法把他显示到界面上，然后这次在浏览器地址栏中属性程序路径加上QueryString，然后执行：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205161630391926.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205161630395797.png" width="511" height="108" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mgen/aggbug/2504230.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mgen/archive/2012/05/16/2504230.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mgen/archive/2012/05/16/2504144.html</id><title type="text">Silverlight以及Windows Phone：解析元素在Visual Tree和Logical Tree中的位置</title><summary type="text">看看在标准的Silverlight下和Silverlight For Windows Phone中怎样解析元素在Visual Tree和Logical Tree中的位置。以前也过一篇在Windows 8 WinRT框架下同样意图的文章：WinRT/Metro：解析元素在Visual Tree和Logical Tree中的位置。由于WinRT在界面XAML上和Silverlight极为相似，因此那篇WinRT文章的代码基本适用于Silverlight。因为不管是WinRT还是Silverlight，相比WPF，他们都没有LogicalTreeHelper类型，UIElement的上一级也不是Vi</summary><published>2012-05-16T07:58:00Z</published><updated>2012-05-16T07:58:00Z</updated><author><name>_Mgen</name><uri>http://www.cnblogs.com/mgen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mgen/archive/2012/05/16/2504144.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mgen/archive/2012/05/16/2504144.html"/><content type="html">&lt;p&gt;看看在标准的Silverlight下和Silverlight For Windows Phone中怎样解析元素在Visual Tree和Logical Tree中的位置。以前也过一篇在Windows 8 WinRT框架下同样意图的文章：&lt;a href="http://www.cnblogs.com/mgen/archive/2012/03/09/2388324.html"&gt;WinRT/Metro：解析元素在Visual Tree和Logical Tree中的位置&lt;/a&gt;。由于WinRT在界面XAML上和Silverlight极为相似，因此那篇WinRT文章的代码基本适用于Silverlight。因为不管是WinRT还是Silverlight，相比WPF，他们都没有LogicalTreeHelper类型，UIElement的上一级也不是Visual类型，FrameworkElement没有LogicalChildren属性……&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;在Silverlight下：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205161558151643.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205161558162689.png" width="388" height="193" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;两个列表是一样的，简单明了（没有像WPF那样嵌套一大堆东西）&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;在Windows Phone下：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205161558166244.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205161558167084.png" width="361" height="212" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;界面XAML：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;Grid&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #93c763"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;RowDefinition&lt;/span&gt;&lt;span style="color: #678cb1"&gt; Height&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;auto&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;RowDefinition&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #93c763"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #ec7600"&gt;Logical Tree&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #93c763"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #678cb1"&gt; Grid.Column&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #ec7600"&gt;Visual Tree&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #93c763"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;ListBox&lt;/span&gt;&lt;span style="color: #678cb1"&gt; Name&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;lbxLogical&amp;quot;&lt;/span&gt;&lt;span style="color: #678cb1"&gt; Grid.Row&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #ec7600"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #93c763"&gt;ListBox&lt;/span&gt;&lt;span style="color: #678cb1"&gt; Name&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;lbxVisual&amp;quot;&lt;/span&gt;&lt;span style="color: #678cb1"&gt; Grid.Row&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color: #678cb1"&gt; Grid.Column&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #93c763"&gt;Grid&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;获取Visual Tree和Logical Tree代码：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #8c8cb4"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyObject&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; GetVisualTree(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyObject&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; obj)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; list &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;List&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyObject&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;() { obj };&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; res &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; obj;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;while&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; ((res &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;VisualTreeHelper&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetParent(res)) &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;!=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Add(res);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;return&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; list&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;AsEnumerable()&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Reverse();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #8c8cb4"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyObject&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; GetLogicalTree(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyObject&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; obj)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; list &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;List&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyObject&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;() { obj };&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; res &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; obj;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;while&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; ((res &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; GetParent(res)) &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;!=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Add(res);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;return&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; list&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;AsEnumerable()&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Reverse();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;DependencyObject&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; GetParent(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyObject&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; obj)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;var&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; ff &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; obj &lt;/span&gt;&lt;span style="color: #93c763"&gt;as&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FrameworkElement&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;if&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (ff &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;!=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;return&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; ff&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Parent;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;return&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;null&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;最后在相应Loaded事件内执行（分别解析两个ListBox做示例）&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;lbxLogical&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ItemsSource &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; GetLogicalTree(lbxLogical)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Select(d &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; d&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType()&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;lbxVisual&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;ItemsSource &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; GetVisualTree(lbxVisual)&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Select(d &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; d&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;GetType()&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Name);&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://www.cnblogs.com/mgen/aggbug/2504144.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mgen/archive/2012/05/16/2504144.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mgen/archive/2012/05/14/2499701.html</id><title type="text">WPF和Silverlight：Frame中Page的缓存设置</title><summary type="text">目录 WPF中KeepAlive和FrameworkPropertyMetadataOptions.Journal Silverlight中NavigationCacheMode和CacheSize 返回目录 WPF中KeepAlive和FrameworkPropertyMetadataOptions.Journal 在WPF中，Page默认是不缓存的。每次导航返回至Page，Page都要被重新构建。 为了方便做测试，我们这样定义Page，首先在Page中注册一个普通的依赖属性，默认值是“默认”。 public sta...</summary><published>2012-05-14T09:39:00Z</published><updated>2012-05-14T09:39:00Z</updated><author><name>_Mgen</name><uri>http://www.cnblogs.com/mgen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mgen/archive/2012/05/14/2499701.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mgen/archive/2012/05/14/2499701.html"/><content type="html">&lt;a id="_hContent"&gt;&lt;/a&gt;  &lt;div class="mgen_content"&gt;   &lt;p&gt;目录&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="#_h1"&gt;WPF中KeepAlive和FrameworkPropertyMetadataOptions.Journal&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="#_h2"&gt;Silverlight中NavigationCacheMode和CacheSize&lt;/a&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a id="_h1" href="#_hContent"&gt;返回目录&lt;/a&gt;  &lt;p&gt;&lt;strong&gt;WPF中KeepAlive和FrameworkPropertyMetadataOptions.Journal&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在WPF中，Page默认是不缓存的。每次导航返回至Page，Page都要被重新构建。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;为了方便做测试，我们这样定义Page，首先在Page中注册一个普通的依赖属性，默认值是“默认”。&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #93c763"&gt;public&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;static&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;readonly&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyProperty&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; MyPropertyProperty &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyProperty&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Register(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;MyProperty&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;), &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Page1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;),&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FrameworkPropertyMetadata&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;默认&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FrameworkPropertyMetadataOptions&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;None));&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;public&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; MyProperty&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;get&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; { &lt;/span&gt;&lt;span style="color: #93c763"&gt;return&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)GetValue(MyPropertyProperty); }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;set&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; { SetValue(MyPropertyProperty, &lt;/span&gt;&lt;span style="color: #93c763"&gt;value&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;); }&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;接着在Page的构造函数和Loaded事件中，分别修改和输出创建次数和属性值。&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//创建次数&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;static&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;int&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; count &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;0&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;public&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; Page1()&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; InitializeComponent();&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;++&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;count;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//第一次创建时把属性修改成&amp;quot;Mgen&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;if&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; (count &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;==&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #ffcd22"&gt;1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MyProperty &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Mgen&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;private&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;void&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; Page_Loaded(&lt;/span&gt;&lt;span style="color: #93c763"&gt;object&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; sender, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;RoutedEventArgs&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; e)&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #66747b"&gt;//tbl变量是Page中的TextBlock对象&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; tbl&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Text &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;String&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Format(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;生成次数：{0} 属性值：{1}&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, count, MyProperty);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;上面代码，第一次运行，显示生成次数是1，属性值是”Mgen”，但是当Frame的当前Page被切换后，再次返回当前Page，属性值会是”默认”，而且创建次数会不断增加：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205141738559087.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205141738555151.png" width="217" height="51" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;首先可以使用Page.KeepAlive方法，该属性设置成True之后，Page对象将会被保存，因此所有属性都会被保留：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #678cb1"&gt;KeepAlive&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;True&amp;quot;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;所以无论切换页面多少次，救过总会是：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205141738552086.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205141738562053.png" width="217" height="48" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;另一个方法就是使用依赖属性元数据中的：FrameworkPropertyMetadataOptions.Journal。事实上，WPF不是盲目地扔掉Page在完全重新构建，它会保存某些依赖属性的值，当页面再次构建后把这些值还原掉。这些依赖属性就是被标记有FrameworkPropertyMetadataOptions.Journal的，常见的此类属性比如说有TextBox.Text。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;那么就需要修改我们依赖属性的注册代码，加上FrameworkPropertyMetadataOptions.Journal：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #66747b"&gt;//使用FrameworkPropertyMetadataOptions.Journal&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #93c763"&gt;public&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;static&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;readonly&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyProperty&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; MyPropertyProperty &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyProperty&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Register(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;MyProperty&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;), &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Page1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;),&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FrameworkPropertyMetadata&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;默认&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;,&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;FrameworkPropertyMetadataOptions&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Journal));&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;此时我们不需要KeepAlive属性，即便是Page在切换后会被重新创建，但是属性值不会改变，因为它被还原了：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/20120514173856625.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205141738567560.png" width="236" height="61" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a id="_h2" href="#_hContent"&gt;返回目录&lt;/a&gt;  &lt;p&gt;&lt;strong&gt;Silverlight中NavigationCacheMode和CacheSize&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Silverlight中，首先定义Frame和Page需要额外引用System.Windows.Navigation命名空间。其次Frame类型的Navigate方法只支持Uri对象：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;frame&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Navigate(&lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;Uri&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;/Page2.xaml&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #678cb1"&gt;UriKind&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Relative));&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;其次依赖属性的注册上，根本没有FrameworkPropertyMetadataOptions，只有简单的PropertyMetadata，注册代码如下：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #93c763"&gt;public&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;static&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #93c763"&gt;readonly&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyProperty&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; MyPropertyProperty &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;=&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;DependencyProperty&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Register(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;MyProperty&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;, &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #93c763"&gt;string&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;), &lt;/span&gt;&lt;span style="color: #93c763"&gt;typeof&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #678cb1"&gt;Page1&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;),&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #93c763"&gt;new&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #678cb1"&gt;PropertyMetadata&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;默认&amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;));&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;OK，代码可以运行后，你会发现Silverlight和WPF一样，默认都是不做任何缓存的：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205141738568050.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205141738573349.png" width="244" height="74" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Silverlight需要设置的属性是Page.NavigationCacheMode和Frame.CacheSize。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;NavigationCacheMode的默认值是Disabled，用户可以选择Enabled和Required。Required总会使Page被缓存，而Enabled属性会参考Page的数量是否在Frame的CacheSize内（默认是10），如果不是的话，Page则不会被缓存。更详细的解释可以参考MSDN：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.windows.controls.page.navigationcachemode"&gt;http://msdn.microsoft.com/zh-cn/library/system.windows.controls.page.navigationcachemode&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;所以在代码中把NavigationCacheMode改成Required：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #678cb1"&gt;NavigationCacheMode&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;=&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Required&amp;quot;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;无论切换多少次，结果总会是：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205141738571921.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/mgen/201205/201205141738578856.png" width="244" height="67" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;再次强调一下，Silverlight中没有FrameworkPropertyMetadataOptions，因此不能像WPF的FrameworkPropertyMetadataOptions.Journal那样，重新构建Page同时自动还原依赖属性值。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mgen/aggbug/2499701.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mgen/archive/2012/05/14/2499701.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mgen/archive/2012/05/14/2499150.html</id><title type="text">WPF：Frame的成员在导航中的变化</title><summary type="text">理解Frame在导航中Source、CurrentSource和Content属性，以及导航事件中NavigationEventArgs类型的Uri和Content属性。 在Frame的Navigating和Navigated事件中，插入如下调试代码： Debug.WriteLine("NavigationEventArgs.Uri: " + e.Uri); Debug.WriteLine("NavigationEventArgs.Content: " + e.Content); Debug.WriteLine("Frame.Source: &amp;</summary><published>2012-05-14T03:50:00Z</published><updated>2012-05-14T03:50:00Z</updated><author><name>_Mgen</name><uri>http://www.cnblogs.com/mgen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mgen/archive/2012/05/14/2499150.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mgen/archive/2012/05/14/2499150.html"/><content type="html">&lt;p&gt;理解Frame在导航中Source、CurrentSource和Content属性，以及导航事件中NavigationEventArgs类型的Uri和Content属性。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;在Frame的Navigating和Navigated事件中，插入如下调试代码：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #678cb1"&gt;Debug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;NavigationEventArgs.Uri: &amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; e&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Uri);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Debug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;NavigationEventArgs.Content: &amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; e&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Content);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Debug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Frame.Source: &amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; frame&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Source);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Debug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Frame.CurrentSource: &amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; frame&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;CurrentSource);&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #678cb1"&gt;Debug&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;WriteLine(&lt;/span&gt;&lt;span style="color: #ec7600"&gt;&amp;quot;Frame.Content: &amp;quot;&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; &lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;+&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt; frame&lt;/span&gt;&lt;span style="color: #e8e2b7"&gt;.&lt;/span&gt;&lt;span style="color: #f1f2f3"&gt;Content);&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;当Frame的Source定义成Page1.xaml，窗体显示后数据（Mgen_WPF是程序集名称也是默认的命名空间）：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;=== Navigating ===&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NavigationEventArgs.Uri: Mgen_WPF;component/page1.xaml&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NavigationEventArgs.Content: &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.Source: page1.xaml&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.CurrentSource: &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.Content: &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;=== Navigated ===&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NavigationEventArgs.Uri: Mgen_WPF;component/page1.xaml&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NavigationEventArgs.Content: Mgen_WPF.Page1&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.Source: Mgen_WPF;component/page1.xaml&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.CurrentSource: Mgen_WPF;component/page1.xaml&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.Content: Mgen_WPF.Page1&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;可以看到，最初Navigating发生时，只有Frame.Source和NavigationEventArgs的Uri有值。当Navigated发生后，NavigationEventArgs和Frame的Content都是解析后的Page对象。而且Frame的CurrentSource也等于Source属性。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;当从Page1的一个链接导航至Page2后，数据如下：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;=== Navigating ===&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NavigationEventArgs.Uri: Mgen_WPF;component/page2.xaml&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NavigationEventArgs.Content: &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.Source: Mgen_WPF;component/page2.xaml&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.CurrentSource: Mgen_WPF;component/page1.xaml&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.Content: Mgen_WPF.Page1&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;=== Navigated ===&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NavigationEventArgs.Uri: Mgen_WPF;component/page2.xaml&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NavigationEventArgs.Content: Mgen_WPF.Page2&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.Source: Mgen_WPF;component/page2.xaml&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.CurrentSource: Mgen_WPF;component/page2.xaml&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.Content: Mgen_WPF.Page2&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Navigated不用说了，当导航结束后，所有属性都是Page2相关的了。而Navigating属性，除了Frame的Content和CurrentSource是Page1，所有其他列举的属性都是Page2相关的。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;当从Page1导航至网络地址后，数据如下：&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code"&gt;   &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;=== Navigating ===&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NavigationEventArgs.Uri: http://www.baidu.com/&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NavigationEventArgs.Content: &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.Source: http://www.baidu.com/&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.CurrentSource: Mgen_WPF;component/page1.xaml&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.Content: Mgen_WPF.Page1&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;=== Navigated ===&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NavigationEventArgs.Uri: http://www.baidu.com/&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;NavigationEventArgs.Content: System.Windows.Controls.WebBrowser&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.Source: http://www.baidu.com/&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.CurrentSource: http://www.baidu.com/&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="color: #f1f2f3"&gt;Frame.Content: System.Windows.Controls.WebBrowser&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;逻辑上和上面类似，但是地址直接变成了网络地址，同时空间对象是WPF的WebBrowser控件。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mgen/aggbug/2499150.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mgen/archive/2012/05/14/2499150.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
