﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-TerryLee's Tech Space</title><link>http://www.cnblogs.com/Terrylee/</link><description>TerryLee技术专栏</description><language>zh-cn</language><lastBuildDate>Mon, 08 Sep 2008 01:23:48 GMT</lastBuildDate><pubDate>Mon, 08 Sep 2008 01:23:48 GMT</pubDate><ttl>60</ttl><item><title>Managed Extensibility Framework在Codeplex上开放全部源码</title><link>http://www.cnblogs.com/Terrylee/archive/2008/09/08/microsoft-extensibility-framework-released-on-codeplex.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Sun, 07 Sep 2008 16:29:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/09/08/microsoft-extensibility-framework-released-on-codeplex.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1286462.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/09/08/microsoft-extensibility-framework-released-on-codeplex.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1286462.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1286462.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_vs.png" alt=""/></div>就在几天前，我写了一篇关于Managed Extensibility Framework（MEF）的文章《使用Managed Extensibility Framework方便的扩展应用程序》，有一位朋友提到MEF为什么不在codeplex上，而当时我的回答是不放在Codeplex上是因为它现在还不开源，所以只能放在http://code.msdn.microsoft.com上了。然而，还不到一周的时间，微软就在Codeplex上开放了全部的源码，以及相关的文档等。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/09/08/microsoft-extensibility-framework-released-on-codeplex.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1286462.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42142/" target="_blank">[新闻]Google申请“海上数据中心”专利 可能付诸行动</a>]]></description></item><item><title>使用Managed Extensibility Framework方便的扩展应用程序</title><link>http://www.cnblogs.com/Terrylee/archive/2008/09/01/uisng-managed-extensibility-framework-overview.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Sun, 31 Aug 2008 16:21:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/09/01/uisng-managed-extensibility-framework-overview.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1280768.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/09/01/uisng-managed-extensibility-framework-overview.html#Feedback</comments><slash:comments>32</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1280768.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1280768.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_vs.png" alt=""/></div>Managed Extensibility Framework（MEF）是.NET平台下的一个扩展性管理框架，它是一系列特性的集合，包括依赖注入（DI）以及Duck Typing等。MEF为开发人员提供了一个工具，让我们可以轻松的对应用程序进行扩展并且对已有的代码产生最小的影响，开发人员在开发过程中根据功能要求定义一些扩展点，之后扩展人员就可以使用这些扩展点与应用程序交互；同时MEF让应用程序与扩展程序之间不产生直接的依赖，这样也允许在多个具有同样的扩展需求之间共享扩展程序。
<br/><br/>
本文将介绍一下Managed Extensibility Framework的一些基本使用。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/09/01/uisng-managed-extensibility-framework-overview.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1280768.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42141/" target="_blank">[新闻]用Google Earth实时追踪人造卫星</a>]]></description></item><item><title>使用.NET Framework中新的日期时间类型</title><link>http://www.cnblogs.com/Terrylee/archive/2008/08/29/using-net-framework-new-datetime-data-type.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Fri, 29 Aug 2008 15:13:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/08/29/using-net-framework-new-datetime-data-type.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1279825.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/08/29/using-net-framework-new-datetime-data-type.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1279825.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1279825.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_vs.png" alt=""/></div>写下本文缘于前几天博客园一位朋友发表了一篇.NET面试题的文章，其中一个关于DateTime的问题引起了大家激烈的争论，鉴于日期时间类型是大家开发中会频繁使用的一个中数据类型，这里我们有必要来对.NET Framework中的日期时间类型做一个深入的认识。
<br/>
<br/>
本文我们将对DateTime，DateTimeOffset，TimeZone，TimeZoneInfo等类型进行讨论。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/08/29/using-net-framework-new-datetime-data-type.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1279825.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42140/" target="_blank">[新闻]传IBM将以35亿美元至40亿美元收购北电</a>]]></description></item><item><title>打造自己的LINQ Provider（中）：IQueryable和IQueryProvider</title><link>http://www.cnblogs.com/Terrylee/archive/2008/08/25/custom-linq-provider-part-2-IQueryable-IQueryProvider.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Mon, 25 Aug 2008 15:59:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/08/25/custom-linq-provider-part-2-IQueryable-IQueryProvider.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1276200.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/08/25/custom-linq-provider-part-2-IQueryable-IQueryProvider.html#Feedback</comments><slash:comments>28</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1276200.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1276200.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_vs.png" alt=""/></div>在.NET Framework 3.5中提供了LINQ 支持后，LINQ就以其强大而优雅的编程方式赢得了开发人员的喜爱，而各种LINQ Provider更是满天飞，如LINQ to NHibernate、LINQ to Google等，大有“一切皆LINQ”的趋势。LINQ本身也提供了很好的扩展性，使得我们可以轻松的编写属于自己的LINQ Provider。 
<br/>
<br/>
本文为打造自己的LINQ Provider系列文章第二篇，主要详细介绍自定义LINQ Provider中两个最重要的接口IQueryable和IQueryProvider。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/08/25/custom-linq-provider-part-2-IQueryable-IQueryProvider.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1276200.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42139/" target="_blank">[新闻]Google卫星已经开始工作</a>]]></description></item><item><title>谈谈Silverlight 2中的视觉状态管理 Part2</title><link>http://www.cnblogs.com/Terrylee/archive/2008/08/14/silverlight-2-visual-state-manager-part-2.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Wed, 13 Aug 2008 17:04:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/08/14/silverlight-2-visual-state-manager-part-2.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1267360.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/08/14/silverlight-2-visual-state-manager-part-2.html#Feedback</comments><slash:comments>26</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1267360.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1267360.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_silverlight2.gif" alt=""/></div>在WPF和Silverlight中的控件模板支持自定义控件的观感，所谓的外观，指控件的视觉效果；而感觉则是控件交互的响应性，如在控件上按下鼠标、控件获得焦点等状态的改变。微软在Silverlight 2 Beta 2中引进了一个新的概念视觉状态管理（Visual State Manager），为我们创建交互性的控件模板提供了极大的方便。接下来我将会用几篇文章来介绍一下Silverlight 2中的视觉状态管理。
<br/>
本文为该系列第二篇，介绍如何利用Silverlight 2中的视觉状态管理来定制控件观感。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/08/14/silverlight-2-visual-state-manager-part-2.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1267360.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42138/" target="_blank">[新闻]Chrome又曝漏洞 “保存为”功能“引狼入室”</a>]]></description></item><item><title>打造自己的LINQ Provider（上）：Expression Tree揭秘</title><link>http://www.cnblogs.com/Terrylee/archive/2008/08/01/custom-linq-provider-part-1-expression-tree.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Thu, 31 Jul 2008 17:19:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/08/01/custom-linq-provider-part-1-expression-tree.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1257720.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/08/01/custom-linq-provider-part-1-expression-tree.html#Feedback</comments><slash:comments>75</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1257720.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1257720.html</trackback:ping><description><![CDATA[<h2>概述</h2> <p>在.NET Framework 3.5中提供了LINQ 支持后，LINQ就以其强大而优雅的编程方式赢得了开发人员的喜爱，而各种LINQ Provider更是满天飞，如LINQ to NHibernate、LINQ to Google等，大有“一切皆LINQ”的趋势。LINQ本身也提供了很好的扩展性，使得我们可以轻松的编写属于自己的LINQ Provider。  <p>本文为打造自己的LINQ Provider系列文章第一篇，主要介绍表达式目录树（Expression Tree）的相关知识。  <h2>认识表达式目录树</h2> <p>究竟什么是表达式目录树（Expression Tree），它是一种抽象语法树或者说它是一种数据结构，通过解析表达式目录树，可以实现我们一些特定的功能（后面会说到），我们首先来看看如何构造出一个表达式目录树，最简单的方法莫过于使用Lambda表达式，看下面的代码：<pre class="code"><span style="color: #2b91af">Expression</span>&lt;<span style="color: #2b91af">Func</span>&lt;<span style="color: blue">int</span>, <span style="color: blue">int</span>, <span style="color: blue">int</span>&gt;&gt; expression = (a, b) =&gt; a * b + 2;</pre><a href="http://11011.net/software/vspaste"></a>
<p>在我们将Lambda表达式指定给Expression&lt;TDelegate&gt;类型的变量（参数）时，编译器将会发出生成表达式目录树的指令，如上面这段代码中的Lambda表达式(a, b) =&gt; a * b + 2将创建一个表达式目录树，它表示的是一种数据结构，即我们把一行代码用数据结构的形式表示了出来，具体来说最终构造出来的表达式目录树形状如下图所示： 
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="314" alt="TerryLee_0160" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0160_3.png" width="465" border="0"> 
<p>这里每一个节点都表示一个表达式，可能是一个二元运算，也可能是一个常量或者参数等，如上图中的ParameterExpression就是一个参数表达式，ConstantExpression是一个常量表达式，BinaryExpression是一个二元表达式。我们也可以在Visual Studio中使用Expression Tree Visualizer来查看该表达式目录树： 
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="102" alt="TerryLee_0166" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0166_3.png" width="430" border="0"> 
<p>查看结果如下图所示： 
<p><a href="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0162_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="621" alt="TerryLee_0162" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0162_thumb.png" width="414" border="0"></a> 
<p>这里说一句，Expression Tree Visualizer可以从<a title="MSDN Code Gallery" href="http://code.msdn.microsoft.com/">MSDN Code Gallery</a>上的LINQ Sample中得到。现在我们知道了表达式目录树的组成，来看看.NET Framework到底提供了哪些表达式？如下图所示： 
<p><a href="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0161_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="508" alt="TerryLee_0161" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0161_thumb.png" width="580" border="0"></a> 
<p>它们都继承于抽象的基类Expression，而泛型的Expression&lt;TDelegate&gt;则继承于LambdaExpression。在Expression类中提供了大量的工厂方法，这些方法负责创建以上各种表达式对象，如调用Add()方法将创建一个表示不进行溢出检查的算术加法运算的BinaryExpression对象，调用Lambda方法将创建一个表示lambda 表达式的LambdaExpression对象，具体提供的方法大家可以查阅MSDN。上面构造表达式目录树时我们使用了Lambda表达式，现在我们看一下如何通过这些表达式对象手工构造出一个表达式目录树，如下代码所示：<pre class="code"><span style="color: blue">static void </span>Main(<span style="color: blue">string</span>[] args)
{
    <span style="color: #2b91af">ParameterExpression </span>paraLeft = <span style="color: #2b91af">Expression</span>.Parameter(<span style="color: blue">typeof</span>(<span style="color: blue">int</span>), <span style="color: #a31515">"a"</span>);
    <span style="color: #2b91af">ParameterExpression </span>paraRight = <span style="color: #2b91af">Expression</span>.Parameter(<span style="color: blue">typeof</span>(<span style="color: blue">int</span>), <span style="color: #a31515">"b"</span>);

    <span style="color: #2b91af">BinaryExpression </span>binaryLeft = <span style="color: #2b91af">Expression</span>.Multiply(paraLeft, paraRight);
    <span style="color: #2b91af">ConstantExpression </span>conRight = <span style="color: #2b91af">Expression</span>.Constant(2, <span style="color: blue">typeof</span>(<span style="color: blue">int</span>));

    <span style="color: #2b91af">BinaryExpression </span>binaryBody = <span style="color: #2b91af">Expression</span>.Add(binaryLeft, conRight);

    <span style="color: #2b91af">LambdaExpression </span>lambda = 
        <span style="color: #2b91af">Expression</span>.Lambda&lt;<span style="color: #2b91af">Func</span>&lt;<span style="color: blue">int</span>, <span style="color: blue">int</span>, <span style="color: blue">int</span>&gt;&gt;(binaryBody, paraLeft, paraRight);

    <span style="color: #2b91af">Console</span>.WriteLine(lambda.ToString());

    <span style="color: #2b91af">Console</span>.Read();
}</pre><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a>
<p>这里构造的表达式目录树，仍然如下图所示： 
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="314" alt="TerryLee_0160" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0160_3.png" width="465" border="0"> 
<p>运行这段代码，看看输出了什么： 
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="183" alt="TerryLee_0158" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0158_6.png" width="524" border="0">&nbsp;&nbsp; <p>可以看到，通过手工构造的方式，我们确实构造出了同前面一样的Lambda表达式。对于一个表达式目录树来说，它有几个比较重要的属性： 
<p>Body：指表达式的主体部分； 
<p>Parameters：指表达式的参数； 
<p>NodeType：指表达式的节点类型，如在上面的例子中，它的节点类型是Lambda； 
<p>Type：指表达式的静态类型，在上面的例子中，Type为Fun&lt;int,int,int&gt;。 
<p>在Expression Tree Visualizer中，我们可以看到表达式目录树的相关属性，如下图所示： 
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="287" alt="TerryLee_0163" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0163_3.png" width="502" border="0">&nbsp; <h2>表达式目录树与委托</h2>
<p>大家可能经常看到如下这样的语言，其中第一句是直接用Lambda表达式来初始化了Func委托，而第二句则使用Lambda表达式来构造了一个表达式目录树，它们之间的区别是什么呢？<pre class="code"><span style="color: blue">static void </span>Main(<span style="color: blue">string</span>[] args)
{
    <span style="color: #2b91af">Func</span>&lt;<span style="color: blue">int</span>, <span style="color: blue">int</span>, <span style="color: blue">int</span>&gt; lambda = (a, b) =&gt; a + b * 2;

    <span style="color: #2b91af">Expression</span>&lt;<span style="color: #2b91af">Func</span>&lt;<span style="color: blue">int</span>, <span style="color: blue">int</span>, <span style="color: blue">int</span>&gt;&gt; expression = (a, b) =&gt; a + b * 2;
} </pre><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a>
<p>其实看一下IL就很明显，其中第一句直接将Lambda表达式直接编译成了IL，如下代码所示：<pre class="code">.method <span style="color: blue">private </span>hidebysig <span style="color: blue">static void  </span>Main(<span style="color: blue">string</span>[] args) cil managed
{
  .entrypoint
  .maxstack  3
  .locals init ([0] <span style="color: blue">class </span>[System.Core]System.Func`3&lt;int32,int32,int32&gt; lambda)
  IL_0000:  nop
  IL_0001:  ldsfld     <span style="color: blue">class </span>[System.Core]System.Func`3&lt;int32,int32,int32&gt; 
                        TerryLee.LinqToLiveSearch.Program::<span style="color: #a31515">'CS$&lt;&gt;9__CachedAnonymousMethodDelegate1'
  </span>IL_0006:  brtrue.s   IL_001b
  IL_0008:  ldnull
  IL_0009:  ldftn      int32 TerryLee.LinqToLiveSearch.Program::<span style="color: #a31515">'&lt;Main&gt;b__0'</span>(int32,
                                                                             int32)
  IL_000f:  newobj     instance <span style="color: blue">void class </span>[System.Core]System.Func`3&lt;int32,int32,int32&gt;::.ctor(<span style="color: blue">object</span>,
                                                                                                native <span style="color: blue">int</span>)
  IL_0014:  stsfld     <span style="color: blue">class </span>[System.Core]System.Func`3&lt;int32,int32,int32&gt; 
                    TerryLee.LinqToLiveSearch.Program::<span style="color: #a31515">'CS$&lt;&gt;9__CachedAnonymousMethodDelegate1'
  </span>IL_0019:  br.s       IL_001b
  IL_001b:  ldsfld     <span style="color: blue">class </span>[System.Core]System.Func`3&lt;int32,int32,int32&gt; 
                    TerryLee.LinqToLiveSearch.Program::<span style="color: #a31515">'CS$&lt;&gt;9__CachedAnonymousMethodDelegate1'
  </span>IL_0020:  stloc.0
  IL_0021:  ret
}</pre><a href="http://11011.net/software/vspaste"></a>
<p>而第二句，由于告诉编译器是一个表达式目录树，所以编译器会分析该Lambda表达式，并生成表示该Lambda表达式的表达式目录树，即它与我们手工创建表达式目录树所生成的IL是一致的，如下代码所示，此处为了节省空间省略掉了部分代码：<pre class="code">.method <span style="color: blue">private </span>hidebysig <span style="color: blue">static void  </span>Main(<span style="color: blue">string</span>[] args) cil managed
{
  .entrypoint
  .maxstack  4
  .locals init ([0] <span style="color: blue">class </span>[System.Core]System.Linq.Expressions.Expression`1&lt;
                <span style="color: blue">class </span>[System.Core]System.Func`3&lt;int32,int32,int32&gt;&gt; expression,
           [1] <span style="color: blue">class </span>[System.Core]System.Linq.Expressions.ParameterExpression CS$0$0000,
           [2] <span style="color: blue">class </span>[System.Core]System.Linq.Expressions.ParameterExpression CS$0$0001,
           [3] <span style="color: blue">class </span>[System.Core]System.Linq.Expressions.ParameterExpression[] CS$0$0002)
  IL_0000:  nop
  IL_0001:  ldtoken    [mscorlib]System.Int32
  IL_0006:  call       <span style="color: blue">class </span>[mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(...)
  IL_000b:  ldstr      <span style="color: #a31515">"a"
  </span>IL_0010:  call       <span style="color: blue">class </span>[System.Core]System.Linq.Expressions.ParameterExpression 
                        [System.Core]System.Linq.Expressions.Expression::Parameter(
                        <span style="color: blue">class </span>[mscorlib]System.Type,

  IL_0038:  call    <span style="color: blue">class </span>[mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle()
  IL_003d:  call    <span style="color: blue">class </span>[System.Core]System.Linq.Expressions.ConstantExpression 
                    [System.Core]System.Linq.Expressions.Expression::Constant(<span style="color: blue">object</span>,
                    <span style="color: blue">class </span>[mscorlib]System.Type)
  IL_0042:  call    <span style="color: blue">class </span>[System.Core]System.Linq.Expressions.BinaryExpression 
                    [System.Core]System.Linq.Expressions.Expression::Multiply(<span style="color: blue">class </span>[System.Core]System.Linq.Expressions.Expression,
                    <span style="color: blue">class </span>[System.Core]System.Linq.Expressions.Expression)
  IL_0047:  call    <span style="color: blue">class </span>[System.Core]System.Linq.Expressions.BinaryExpression
                    [System.Core]System.Linq.Expressions.Expression::Add(<span style="color: blue">class </span>[System.Core]System.Linq.Expressions.Expression,
                    <span style="color: blue">class </span>[System.Core]System.Linq.Expressions.Expression)
  IL_004c:  ldc.i4.2
  IL_004d:  newarr     [System.Core]System.Linq.Expressions.ParameterExpression
}</pre><a href="http://11011.net/software/vspaste"></a>
<p>现在相信大家都看明白了，这里讲解它们的区别主要是为了加深大家对于表达式目录树的区别。 
<h2>执行表达式目录树</h2>
<p>前面已经可以构造出一个表达式目录树了，现在看看如何去执行表达式目录树。我们需要调用Compile方法来创建一个可执行委托，并且调用该委托，如下面的代码：<pre class="code"><span style="color: blue">static void </span>Main(<span style="color: blue">string</span>[] args)
{
    <span style="color: #2b91af">ParameterExpression </span>paraLeft = <span style="color: #2b91af">Expression</span>.Parameter(<span style="color: blue">typeof</span>(<span style="color: blue">int</span>), <span style="color: #a31515">"a"</span>);
    <span style="color: #2b91af">ParameterExpression </span>paraRight = <span style="color: #2b91af">Expression</span>.Parameter(<span style="color: blue">typeof</span>(<span style="color: blue">int</span>), <span style="color: #a31515">"b"</span>);

    <span style="color: #2b91af">BinaryExpression </span>binaryLeft = <span style="color: #2b91af">Expression</span>.Multiply(paraLeft, paraRight);
    <span style="color: #2b91af">ConstantExpression </span>conRight = <span style="color: #2b91af">Expression</span>.Constant(2, <span style="color: blue">typeof</span>(<span style="color: blue">int</span>));

    <span style="color: #2b91af">BinaryExpression </span>binaryBody = <span style="color: #2b91af">Expression</span>.Add(binaryLeft, conRight);

    <span style="color: #2b91af">Expression</span>&lt;<span style="color: #2b91af">Func</span>&lt;<span style="color: blue">int</span>, <span style="color: blue">int</span>, <span style="color: blue">int</span>&gt;&gt; lambda = 
        <span style="color: #2b91af">Expression</span>.Lambda&lt;<span style="color: #2b91af">Func</span>&lt;<span style="color: blue">int</span>, <span style="color: blue">int</span>, <span style="color: blue">int</span>&gt;&gt;(binaryBody, paraLeft, paraRight);

    <span style="color: #2b91af">Func</span>&lt;<span style="color: blue">int</span>, <span style="color: blue">int</span>, <span style="color: blue">int</span>&gt; myLambda = lambda.Compile();

    <span style="color: blue">int </span>result = myLambda(2, 3);
    <span style="color: #2b91af">Console</span>.WriteLine(<span style="color: #a31515">"result:" </span>+ result.ToString());

    <span style="color: #2b91af">Console</span>.Read();
}</pre><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a>
<p>运行后输出的结果：</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="214" alt="TerryLee_0159" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0159_3.png" width="553" border="0"> 
<p>这里我们只要简单的调用Compile方法就可以了，事实上在.NET Framework中是调用了一个名为ExpressionCompiler的内部类来做表达式目录树的执行（注意此处的Compiler不等同于编译器的编译）。另外，只能执行表示Lambda表达式的表达式目录树，即LambdaExpression或者Expression&lt;TDelegate&gt;类型。如果表达式目录树不是表示Lambda表达式，需要调用Lambda方法创建一个新的表达式。如下面的代码：<pre class="code"><span style="color: blue">static void </span>Main(<span style="color: blue">string</span>[] args)
{
    <span style="color: #2b91af">BinaryExpression </span>body = <span style="color: #2b91af">Expression</span>.Add(
        <span style="color: #2b91af">Expression</span>.Constant(2),
        <span style="color: #2b91af">Expression</span>.Constant(3));

    <span style="color: #2b91af">Expression</span>&lt;<span style="color: #2b91af">Func</span>&lt;<span style="color: blue">int</span>&gt;&gt; expression = 
        <span style="color: #2b91af">Expression</span>.Lambda&lt;<span style="color: #2b91af">Func</span>&lt;<span style="color: blue">int</span>&gt;&gt;(body, <span style="color: blue">null</span>);

    <span style="color: #2b91af">Func</span>&lt;<span style="color: blue">int</span>&gt; lambda = expression.Compile();

    <span style="color: #2b91af">Console</span>.WriteLine(lambda());
}</pre>
<h2>访问与修改表达式目录树</h2>
<p><a href="http://11011.net/software/vspaste"></a>在本文一开始我就说过， 通过解析表达式目录树，我们可以实现一些特定功能，既然要解析表达式目录树，对于表达式目录树的访问自然是不可避免的。在.NET Framework中，提供了一个抽象的表达式目录树访问类ExpressionVisitor，但它是一个internal的，我们不能直接访问。幸运的是，在MSDN中微软给出了<a href="http://msdn.microsoft.com/zh-cn/library/bb882521.aspx">ExpressionVisitor类的实现</a>，我们可以直接拿来使用。该类是一个抽象类，微软旨在让我们在集成ExpressionVisitor的基础上，实现自己的表达式目录树访问类。现在我们来看简单的表达式目录树：</p><pre class="code"><span style="color: blue">static void </span>Main(<span style="color: blue">string</span>[] args)
{
    <span style="color: #2b91af">Expression</span>&lt;<span style="color: #2b91af">Func</span>&lt;<span style="color: blue">int</span>, <span style="color: blue">int</span>, <span style="color: blue">int</span>&gt;&gt; lambda = (a, b) =&gt; a + b * 2;

    <span style="color: #2b91af">Console</span>.WriteLine(lambda.ToString());
} </pre><a href="http://11011.net/software/vspaste"></a>
<p>输出后为：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0164_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="205" alt="TerryLee_0164" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0164_thumb.png" width="553" border="0"></a> </p>
<p>现在我们想要修改表达式目录树，让它表示的Lambda表达式为(a,b)=&gt;(a - (b * 2))，这时就需要编写自己的表达式目录树访问器，如下代码所示：</p><pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">OperationsVisitor </span>: <span style="color: #2b91af">ExpressionVisitor
</span>{
    <span style="color: blue">public </span><span style="color: #2b91af">Expression </span>Modify(<span style="color: #2b91af">Expression </span>expression)
    {
        <span style="color: blue">return </span>Visit(expression);
    }

    <span style="color: blue">protected override </span><span style="color: #2b91af">Expression </span>VisitBinary(<span style="color: #2b91af">BinaryExpression </span>b)
    {
        <span style="color: blue">if </span>(b.NodeType == <span style="color: #2b91af">ExpressionType</span>.Add)
        {
            <span style="color: #2b91af">Expression </span>left = <span style="color: blue">this</span>.Visit(b.Left);
            <span style="color: #2b91af">Expression </span>right = <span style="color: blue">this</span>.Visit(b.Right);
            <span style="color: blue">return </span><span style="color: #2b91af">Expression</span>.Subtract(left,right);
        }

        <span style="color: blue">return base</span>.VisitBinary(b);
    }
}</pre>
<p>使用表达式目录树访问器来修改表达式目录树，如下代码所示：<pre class="code"><span style="color: blue">static void </span>Main(<span style="color: blue">string</span>[] args)
{
    <span style="color: #2b91af">Expression</span>&lt;<span style="color: #2b91af">Func</span>&lt;<span style="color: blue">int</span>, <span style="color: blue">int</span>, <span style="color: blue">int</span>&gt;&gt; lambda = (a, b) =&gt; a + b * 2;

    <span style="color: blue">var </span>operationsVisitor = <span style="color: blue">new </span><span style="color: #2b91af">OperationsVisitor</span>();
    <span style="color: #2b91af">Expression </span>modifyExpression = operationsVisitor.Modify(lambda);

    <span style="color: #2b91af">Console</span>.WriteLine(modifyExpression.ToString());
}</pre>
<p><a href="http://11011.net/software/vspaste"></a>运行后可以看到输出：</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="205" alt="TerryLee_0165" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0165_3.png" width="552" border="0"> </p>
<p>似乎我们是修改表达式目录树，其实也不全对，我们只是修改表达式目录树的一个副本而已，因为表达式目录树是不可变的，我们不能直接修改表达式目录树，看看上面的OperationsVisitor类的实现大家就知道了，在修改过程中复制了表达式目录树的节点。</p>
<h2>为什么需要表达式目录树</h2>
<p>通过前面的介绍，相信大家对于表达式目录树已经有些了解了，还有一个很重要的问题，就是为什么需要表达式目录树？在本文开始时，就说过通过解析表达式目录树，可以实现我们一些特定的功能，就拿LINQ to SQL为例，看下面这幅图：</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="381" alt="TerryLee_0167" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0167_3.png" width="230" border="0"> </p>
<p>当我们在C#语言中编写一个查询表达式时，它将返回一个IQueryable类型的值，在该类型中包含了两个很重要的属性Expression和Provider，如下面的代码：</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="202" alt="TerryLee_0168" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/LINQProvider_12290/TerryLee_0168_3.png" width="441" border="0"> </p>
<p>我们编写的查询表达式，将封装为一种抽象的数据结构，这个数据结构就是表达式目录树，当我们在使用上面返回的值时，编译器将会以该值所期望的方式进行翻译，这种方式就是由Expression和Provider来决定。可以看到，这样将会非常的灵活且具有良好的可扩展性，有了表达式目录树，可以自由的编写自己的Provider，去查询我们希望的数据源。经常说LINQ为访问各种不同的数据源提供了一种统一的编程方式，其奥秘就在这里。然而需要注意的是LINQ to Objects并不需要任何特定的LINQ Provider，因为它并不翻译为表达式目录树，后面会说到这一点。</p>
<h2>总结</h2>
<p>本为详细介绍了表达式目录树的相关知识，为我们编写自己的LINQ Provider打下一个基础，希望对于大家有所帮助。查看目前网上的各种lINQ Provider，请访问<a href="http://www.cnblogs.com/Terrylee/archive/2008/03/01/LINQ-Providers-List.html">万般皆LINQ</a>。</p>
<p>相关文章：<a href="http://www.cnblogs.com/Terrylee/archive/2008/08/25/custom-linq-provider-part-2-IQueryable-IQueryProvider.html">打造自己的LINQ Provider（中）：IQueryable和IQueryProvider </a></p><img src ="http://www.cnblogs.com/Terrylee/aggbug/1257720.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42137/" target="_blank">[新闻]测试版Office Live Workspace发布6月内用户数量达百万</a>]]></description></item><item><title>书评：硝烟中的Scrum和XP</title><link>http://www.cnblogs.com/Terrylee/archive/2008/08/01/1257768.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Thu, 31 Jul 2008 17:10:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/08/01/1257768.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1257768.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/08/01/1257768.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1257768.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1257768.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_scrum.png" alt=""/></div>且看风清扬的一段话：“……你将这华山派的三四十招融合贯通，设想如何一气呵成，然后全部将它忘干净了，忘的干干净净，一招也不可留在心中。待会便以什么招数也没有的华山剑法，去跟田伯光对打”。如果有人说，既然“无招胜有招”是武学的最高境界，那干脆什么招数都不要学，拿把剑乱挥乱舞，处处破绽，也就是处处无破绽，便是天下第一了。听到这话的人肯定会笑他缺心眼。
<br/>
这不是一本“是什么”的书，而是一本“如何做”的书，的确书如其名，纵观全书，没有空洞乏味的理论，只有……&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/08/01/1257768.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1257768.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42137/" target="_blank">[新闻]测试版Office Live Workspace发布6月内用户数量达百万</a>]]></description></item><item><title>技巧：在Silverlight应用程序中进行数据验证</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/29/binding-data-validation-in-silverlight.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Tue, 29 Jul 2008 15:37:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/29/binding-data-validation-in-silverlight.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1256009.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/29/binding-data-validation-in-silverlight.html#Feedback</comments><slash:comments>38</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1256009.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1256009.html</trackback:ping><description><![CDATA[<h2>概述</h2> <p>众所周知，在ASP.NET应用程序中，我们可以使用验证控件进行数据输入的验证，遗憾的是在Silverlight中并没有提供任何验证控件，但Silverlight对于双向数据绑定还是提供了一些基本的数据验证支持，我们可以在set设置器中定义验证规则，并对于不合法数据抛出异常，最后通过捕获验证错误事件来实现数据的验证。</p> <p><a href="http://www.cnblogs.com/Terrylee/archive/2008/07/29/binding-data-validation-in-silverlight.html">本文</a>将介绍在Silverlight应用程序中如何进行数据验证。</p> <h2>准备知识</h2> <p>Silverlight中如下两种情况下，将会触发验证错误：</p> <p>1.在绑定引擎中执行数据转换时抛出异常</p> <p>2.在业务实体的set设置器中抛出异常</p> <p>为了在验证出错时能够接收到通知，我们必须要在绑定对象上设置如下两个属性为true：</p> <p>ValidatesOnExceptions：告诉绑定引擎当有异常发生时创建一个验证异常</p> <p>NotifyOnValidationError：告诉绑定引擎当有验证错误发生或者错误排除时触发BindingValidationError事件</p> <p>这两个属性都定义在Binding类中，如下代码所示：</p> <p><a href="http://www.cnblogs.com/Terrylee/archive/2008/07/29/binding-data-validation-in-silverlight.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="418" alt="TerryLee_0154" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/Silverlight_13952/TerryLee_0154_3.png" width="494" border="0"></a> </p> <p>BindingValidationError事件定义在FrameworkElement中，通过它可以接收到ValidationErrorEventArgs类型的参数，而在ValidationErrorEventArgs中定义了一个很重要的属性Action，它的定义如下：</p> <p><a href="http://www.cnblogs.com/Terrylee/archive/2008/07/29/binding-data-validation-in-silverlight.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="321" alt="TerryLee_0155" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/Silverlight_13952/TerryLee_0155_3.png" width="524" border="0"></a> </p> <p>这里Added表示新增一个验证异常，Removed表示排除了一个验证异常。下面通过一个实例我们看一下如何使用它们进行数据的验证。</p> <h2>实例</h2> <p>首先我们编写一个简单的业务类，由于数据绑定验证只能在双向绑定中，所以这里需要实现INotifyPropertyChanged接口，如下代码所示，在set设置器中我们对于数据的合法性进行检查，如果不合法则抛出一个异常：</p><pre class="code"><span style="color: gray">/// &lt;summary&gt;
/// </span><span style="color: green">Author:TerryLee
</span><span style="color: gray">/// </span><span style="color: green">http://www.cnblogs.com/Terrylee
</span><span style="color: gray">/// &lt;/summary&gt;
</span><span style="color: blue">public class </span><span style="color: #2b91af">Person </span>: <span style="color: #2b91af">INotifyPropertyChanged
</span>{
    <span style="color: blue">public event </span><span style="color: #2b91af">PropertyChangedEventHandler </span>PropertyChanged;
    <span style="color: blue">private int </span>_age;
    <span style="color: blue">public int </span>Age
    {
        <span style="color: blue">get </span>{ <span style="color: blue">return </span>_age; }
        <span style="color: blue">set </span>{
            <span style="color: blue">if </span>(<span style="color: blue">value </span>&lt; 0)
                <span style="color: blue">throw new </span><span style="color: #2b91af">Exception</span>(<span style="color: #a31515">"年龄输入不合法！"</span>);
            _age = <span style="color: blue">value</span>;
            <span style="color: blue">if </span>(PropertyChanged != <span style="color: blue">null</span>)
            {
                PropertyChanged(<span style="color: blue">this</span>, <span style="color: blue">new </span><span style="color: #2b91af">PropertyChangedEventArgs</span>(<span style="color: #a31515">"Age"</span>));
            }
        }
    }

    <span style="color: blue">private </span><span style="color: #2b91af">String </span>_name = <span style="color: #a31515">"Terry"</span>;
    <span style="color: blue">public </span><span style="color: #2b91af">String </span>Name
    {
        <span style="color: blue">get </span>{ <span style="color: blue">return </span>_name; }
        <span style="color: blue">set </span>{
            <span style="color: blue">if </span>(<span style="color: blue">value</span>.Length &lt; 4)
                <span style="color: blue">throw new </span><span style="color: #2b91af">Exception</span>(<span style="color: #a31515">"姓名输入不合法！"</span>);
            _name = <span style="color: blue">value</span>;
            <span style="color: blue">if </span>(PropertyChanged != <span style="color: blue">null</span>)
            {
                PropertyChanged(<span style="color: blue">this</span>, <span style="color: blue">new </span><span style="color: #2b91af">PropertyChangedEventArgs</span>(<span style="color: #a31515">"Name"</span>));
            }

        }
    }

    <span style="color: blue">public void </span>NotifyPropertyChanged(<span style="color: #2b91af">String </span>propertyName)
    {
        <span style="color: blue">if </span>(PropertyChanged != <span style="color: blue">null</span>)
        {
            PropertyChanged(<span style="color: blue">this</span>, <span style="color: blue">new </span><span style="color: #2b91af">PropertyChangedEventArgs</span>(propertyName));
        }
    }
}</pre><a href="http://11011.net/software/vspaste"></a>
<p>编写数据绑定，如下代码所示，设置NotifyOnValidationError和ValidatesOnExceptions属性为true，并且定义BindingValidationError事件：</p><pre class="code"><span style="color: green">&lt;!--
    http://www.cnblogs.com/Terrylee
--&gt;
</span><span style="color: blue">&lt;</span><span style="color: #a31515">StackPanel </span><span style="color: red">Orientation</span><span style="color: blue">="Horizontal" </span><span style="color: red">Margin</span><span style="color: blue">="10"&gt;
    &lt;</span><span style="color: #a31515">TextBox </span><span style="color: red">x</span><span style="color: blue">:</span><span style="color: red">Name</span><span style="color: blue">="txtName"  </span><span style="color: red">Width</span><span style="color: blue">="200" </span><span style="color: red">Height</span><span style="color: blue">="30"
            </span><span style="color: red">Text</span><span style="color: blue">="{</span><span style="color: #a31515">Binding </span><span style="color: red">Name</span><span style="color: blue">,</span><span style="color: red">Mode</span><span style="color: blue">=TwoWay,
            </span><span style="color: red">NotifyOnValidationError</span><span style="color: blue">=true,
            </span><span style="color: red">ValidatesOnExceptions</span><span style="color: blue">=true}"
            </span><span style="color: red">BindingValidationError</span><span style="color: blue">="txtName_BindingValidationError"&gt;
    &lt;/</span><span style="color: #a31515">TextBox</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">my</span><span style="color: blue">:</span><span style="color: #a31515">Message </span><span style="color: red">x</span><span style="color: blue">:</span><span style="color: red">Name</span><span style="color: blue">="messageName"&gt;&lt;/</span><span style="color: #a31515">my</span><span style="color: blue">:</span><span style="color: #a31515">Message</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">StackPanel</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">StackPanel </span><span style="color: red">Orientation</span><span style="color: blue">="Horizontal" </span><span style="color: red">Margin</span><span style="color: blue">="10"&gt;
    &lt;</span><span style="color: #a31515">TextBox </span><span style="color: red">x</span><span style="color: blue">:</span><span style="color: red">Name</span><span style="color: blue">="txtAge" </span><span style="color: red">Width</span><span style="color: blue">="200" </span><span style="color: red">Height</span><span style="color: blue">="30"
            </span><span style="color: red">Text</span><span style="color: blue">="{</span><span style="color: #a31515">Binding </span><span style="color: red">Age</span><span style="color: blue">,</span><span style="color: red">Mode</span><span style="color: blue">=TwoWay,
            </span><span style="color: red">NotifyOnValidationError</span><span style="color: blue">=true,
            </span><span style="color: red">ValidatesOnExceptions</span><span style="color: blue">=true}"
            </span><span style="color: red">BindingValidationError</span><span style="color: blue">="txtAge_BindingValidationError"&gt;
    &lt;/</span><span style="color: #a31515">TextBox</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">my</span><span style="color: blue">:</span><span style="color: #a31515">Message </span><span style="color: red">x</span><span style="color: blue">:</span><span style="color: red">Name</span><span style="color: blue">="messageAge"&gt;&lt;/</span><span style="color: #a31515">my</span><span style="color: blue">:</span><span style="color: #a31515">Message</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">StackPanel</span><span style="color: blue">&gt;</span></pre><a href="http://11011.net/software/vspaste"></a>
<p>实现BindingValidationError事件，在这里可以根据ValidationErrorEventAction来判断如何进行处理，在界面给出相关的提示信息等，如下代码所示：</p><pre class="code"><span style="color: gray">/// &lt;summary&gt;
/// </span><span style="color: green">Author:TerryLee
</span><span style="color: gray">/// </span><span style="color: green">http://www.cnblogs.com/Terrylee
</span><span style="color: gray">/// &lt;/summary&gt;
</span><span style="color: blue">void </span>txtAge_BindingValidationError(<span style="color: blue">object </span>sender, <span style="color: #2b91af">ValidationErrorEventArgs </span>e)
{
    <span style="color: blue">if </span>(e.Action == <span style="color: #2b91af">ValidationErrorEventAction</span>.Added)
    {
        messageAge.Text = e.Error.Exception.Message;
        messageAge.Validation = <span style="color: blue">false</span>;
    }
    <span style="color: blue">else if </span>(e.Action == <span style="color: #2b91af">ValidationErrorEventAction</span>.Removed)
    {
        messageAge.Text = <span style="color: #a31515">"年龄验证成功"</span>;
        messageAge.Validation = <span style="color: blue">true</span>;
    }
}</pre>
<p><a href="http://11011.net/software/vspaste"></a>好了，现在来看一下最后的验证效果，如下图所示：</p>
<p><a href="http://www.cnblogs.com/Terrylee/archive/2008/07/29/binding-data-validation-in-silverlight.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="302" alt="TerryLee_0156" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/Silverlight_13952/TerryLee_0156_3.png" width="561" border="0"></a> </p>
<p><a href="http://www.cnblogs.com/Terrylee/archive/2008/07/29/binding-data-validation-in-silverlight.html"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="302" alt="TerryLee_0157" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/Silverlight_13952/TerryLee_0157_3.png" width="561" border="0"></a> </p>
<p>通过这样的方式，我们就可以<a href="http://www.cnblogs.com/Terrylee/archive/2008/07/29/binding-data-validation-in-silverlight.html">在Silverlight中对于数据输入做验证</a>了。</p>
<h2>总结</h2>
<p><a href="http://www.cnblogs.com/Terrylee/archive/2008/07/29/binding-data-validation-in-silverlight.html">本文</a>介绍了如何在Silverlight应用程序进行数据验证，希望对大家有所帮助。更多Silverlight 2的文章请参考<a href="http://www.cnblogs.com/Terrylee/archive/2008/07/21/silverlight-2-articles.html">Silverlight 2 相关文章汇总</a>。</p><img src ="http://www.cnblogs.com/Terrylee/aggbug/1256009.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42136/" target="_blank">[新闻]2008年9月8日科技博客精选</a>]]></description></item><item><title>技巧：在Silverlight应用程序中操作Cookie</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/27/tips-set-cookies-in-silverlight-application.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Sun, 27 Jul 2008 12:30:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/27/tips-set-cookies-in-silverlight-application.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1252646.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/27/tips-set-cookies-in-silverlight-application.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1252646.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1252646.html</trackback:ping><description><![CDATA[<h2>概述</h2> <p>很多朋友来信问如何在Silverlight 2中操作Cookie，这里专门写篇文章介绍一下。为了实现在Silverlight应用程序中对于Cookie的操作，我们需要借助于HtmlPage.Document对象。</p> <p>在使用HtmlPage.Document之前，请先添加System.Windows.Browser命名空间。本文介绍了如何在Silverlight应用程序中操作Cookie，并在最后给出了一个操作Cookie的公用类，大家可以直接在自己的应用程序中使用。</p> 
<h2>写入Cookie</h2> <p>在Silverlight 应用程序中，我们可以通过HtmlPage.Document.SetProperty方法来设置Cookie或者使用HtmlPage.Document对象的Cookies属性（后面会讲到），如下代码所示：</p><pre class="code"><span style="color: blue">void </span>btnSet_Click(<span style="color: blue">object </span>sender, <span style="color: #2b91af">RoutedEventArgs </span>e)
{
    <span style="color: #2b91af">DateTime </span>expir = <span style="color: #2b91af">DateTime</span>.UtcNow + <span style="color: #2b91af">TimeSpan</span>.FromDays(7);

    <span style="color: #2b91af">String </span>cookie = <span style="color: #2b91af">String</span>.Format(<span style="color: #a31515">"{0}={1};expires={2}"</span>,
    <span style="color: blue">this</span>.txtKey.Text,
    <span style="color: blue">this</span>.txtValue.Text, 
    expir.ToString(<span style="color: #a31515">"R"</span>));

    <span style="color: #2b91af">HtmlPage</span>.Document.SetProperty(<span style="color: #a31515">"cookie"</span>, cookie);
}</pre><a href="http://11011.net/software/vspaste"></a>
<p>这里设置Cookie的过期时间为一周，除了设置过期时间外还可以设置domain、path等，后面的帮助类中你将看到这一点。</p>
<p>如使用下面的界面写入Cookie：</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="408" alt="TerryLee_0146" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/Silverlight210_D5C8/TerryLee_0146_3.png" width="573" border="0">&nbsp;</p>
<h2>读取Cookie</h2>
<p>我们可以通过HtmlPage.Document.GetProperty方法来获取所有Cookie，另外在HtmlDocument中定义了Cookies属性，已经为我们封装好了GetProperty方法，可以直接使用，它的定义如下代码所示：</p><pre class="code"><span style="color: blue">public sealed class </span><span style="color: #2b91af">HtmlDocument </span>: <span style="color: #2b91af">HtmlObject
</span>{
    <span style="color: blue">public string </span>Cookies
    {
        <span style="color: blue">get</span>{
            <span style="color: #2b91af">HtmlPage</span>.VerifyThread();
            <span style="color: #2b91af">String </span>property = <span style="color: blue">this</span>.GetProperty(<span style="color: #a31515">"cookie"</span>) <span style="color: blue">as </span><span style="color: #2b91af">String</span>;
            <span style="color: blue">if </span>(property != <span style="color: blue">null</span>)
            {
                <span style="color: blue">return </span>property;
            }
            <span style="color: blue">return </span><span style="color: #2b91af">String</span>.Empty;
        }
        <span style="color: blue">set</span>{
            <span style="color: #2b91af">HtmlPage</span>.VerifyThread();
            <span style="color: #2b91af">String </span>str = <span style="color: blue">value</span>;
            <span style="color: blue">if </span>(<span style="color: #2b91af">String</span>.IsNullOrEmpty(str))
            {
                str = <span style="color: blue">string</span>.Empty;
            }
            <span style="color: blue">this</span>.SetProperty(<span style="color: #a31515">"cookie"</span>, str);
        }
    }
}</pre><a href="http://11011.net/software/vspaste"></a>
<p>如使用下面这段代码来获取一个指定Key的Cookie值：</p><pre class="code"><span style="color: blue">void </span>btnRetrieve_Click(<span style="color: blue">object </span>sender, <span style="color: #2b91af">RoutedEventArgs </span>e)
{
    <span style="color: #2b91af">String</span>[] cookies = <span style="color: #2b91af">HtmlPage</span>.Document.Cookies.Split(<span style="color: #a31515">';'</span>);
    <span style="color: blue">foreach </span>(<span style="color: #2b91af">String </span>cookie <span style="color: blue">in </span>cookies)
    {
        <span style="color: #2b91af">String</span>[] keyValues = cookie.Split(<span style="color: #a31515">'='</span>);
        <span style="color: blue">if </span>(keyValues.Length == 2)
        {
            <span style="color: blue">if </span>(keyValues[0].Trim() == <span style="color: blue">this</span>.txtKey.Text.Trim())
            {
                <span style="color: blue">this</span>.txtValue.Text = keyValues[1];
            }
        }
    }
}</pre><a href="http://11011.net/software/vspaste"></a>
<p>如下图所示：</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="408" alt="TerryLee_0147" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/Silverlight210_D5C8/TerryLee_0147_3.png" width="573" border="0"> </p>
<h2>删除Cookie</h2>
<p>删除Cookie非常简单，清空Cookie的值并设置它的过期时间，如下代码所示：</p><pre class="code"><span style="color: blue">void </span>btnDelete_Click(<span style="color: blue">object </span>sender, <span style="color: #2b91af">RoutedEventArgs </span>e)
{
    <span style="color: #2b91af">DateTime </span>expir = <span style="color: #2b91af">DateTime</span>.UtcNow - <span style="color: #2b91af">TimeSpan</span>.FromDays(1);
    <span style="color: blue">string </span>cookie = <span style="color: #2b91af">String</span>.Format(<span style="color: #a31515">"{0}=;expires={1}"</span>,
        <span style="color: blue">this</span>.txtKey.Text, expir.ToString(<span style="color: #a31515">"R"</span>));
    <span style="color: #2b91af">HtmlPage</span>.Document.SetProperty(<span style="color: #a31515">"cookie"</span>, cookie);
}</pre>
<h2>Cookie帮助类</h2>
<p>由于在开发中，我们可能会经常用到对于Cookie的操作，我在这里总结了一个简单的Silverlight中操作Cookie帮助类，大家可以直接在自己的项目中使用，主要有如下几个功能：</p>
<p>1.写入Cookie</p>
<p>2.读取Cookie</p>
<p>3.删除Cookie</p>
<p>4.判断Cookie是否存在</p>
<p>当然如果你还有别的需求，可以再进一步完善，完整的代码如下：</p><pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">CookiesUtils
</span>{
    <span style="color: blue">public static void </span>SetCookie(<span style="color: #2b91af">String </span>key, <span style="color: #2b91af">String </span>value)
    {
        SetCookie(key, value, <span style="color: blue">null</span>, <span style="color: blue">null</span>, <span style="color: blue">null</span>, <span style="color: blue">false</span>);
    }

    <span style="color: blue">public static void </span>SetCookie(<span style="color: #2b91af">String </span>key, <span style="color: #2b91af">String </span>value, <span style="color: #2b91af">TimeSpan </span>expires)
    {
        SetCookie(key, value, expires, <span style="color: blue">null</span>, <span style="color: blue">null</span>, <span style="color: blue">false</span>);
    }

    <span style="color: blue">public static void </span>SetCookie(<span style="color: #2b91af">String </span>key, <span style="color: #2b91af">String </span>value, <span style="color: #2b91af">TimeSpan</span>? expires,
        <span style="color: #2b91af">String </span>path, <span style="color: #2b91af">String </span>domain, <span style="color: blue">bool </span>secure)
    {
        <span style="color: #2b91af">StringBuilder </span>cookie = <span style="color: blue">new </span><span style="color: #2b91af">StringBuilder</span>();
        cookie.Append(<span style="color: #2b91af">String</span>.Concat(key, <span style="color: #a31515">"="</span>, value));

        <span style="color: blue">if </span>(expires.HasValue)
        {
            <span style="color: #2b91af">DateTime </span>expire = <span style="color: #2b91af">DateTime</span>.UtcNow + expires.Value;
            cookie.Append(<span style="color: #2b91af">String</span>.Concat(<span style="color: #a31515">";expires="</span>, expire.ToString(<span style="color: #a31515">"R"</span>)));
        }

        <span style="color: blue">if </span>(!<span style="color: #2b91af">String</span>.IsNullOrEmpty(path))
        {
            cookie.Append(<span style="color: #2b91af">String</span>.Concat(<span style="color: #a31515">";path="</span>, path));
        }

        <span style="color: blue">if </span>(!<span style="color: #2b91af">String</span>.IsNullOrEmpty(domain))
        {
            cookie.Append(<span style="color: #2b91af">String</span>.Concat(<span style="color: #a31515">";domain="</span>, domain));
        }

        <span style="color: blue">if </span>(secure)
        {
            cookie.Append(<span style="color: #a31515">";secure"</span>);
        }

        <span style="color: #2b91af">HtmlPage</span>.Document.SetProperty(<span style="color: #a31515">"cookie"</span>, cookie.ToString()); 
    }

    <span style="color: blue">public static string </span>GetCookie(<span style="color: #2b91af">String </span>key)
    {
        <span style="color: #2b91af">String</span>[] cookies = <span style="color: #2b91af">HtmlPage</span>.Document.Cookies.Split(<span style="color: #a31515">';'</span>);

        <span style="color: #2b91af">String </span>result = (<span style="color: blue">from </span>c <span style="color: blue">in </span>cookies
                        <span style="color: blue">let </span>keyValues = c.Split(<span style="color: #a31515">'='</span>)
                        <span style="color: blue">where </span>keyValues.Length == 2 &amp;&amp; keyValues[0].Trim() == key.Trim()
                        <span style="color: blue">select </span>keyValues[1]).FirstOrDefault();
        <span style="color: blue">return </span>result;
    }

    <span style="color: blue">public static void </span>DeleteCookie(<span style="color: #2b91af">String </span>key)
    {
        <span style="color: #2b91af">DateTime </span>expir = <span style="color: #2b91af">DateTime</span>.UtcNow - <span style="color: #2b91af">TimeSpan</span>.FromDays(1);

        <span style="color: blue">string </span>cookie = <span style="color: #2b91af">String</span>.Format(<span style="color: #a31515">"{0}=;expires={1}"</span>,
            key, expir.ToString(<span style="color: #a31515">"R"</span>));

        <span style="color: #2b91af">HtmlPage</span>.Document.SetProperty(<span style="color: #a31515">"cookie"</span>, cookie);
    }

    <span style="color: blue">public static bool </span>Exists(<span style="color: #2b91af">String </span>key, <span style="color: #2b91af">String </span>value)
    {
        <span style="color: blue">return </span><span style="color: #2b91af">HtmlPage</span>.Document.Cookies.Contains(<span style="color: #2b91af">String</span>.Format(<span style="color: #a31515">"{0}={1}"</span>, key, value));
    }
}</pre><a href="http://11011.net/software/vspaste"></a>
<h2>总结</h2>
<p>本文介绍了在Silverlight应用程序中如何操作Cookie，希望对大家有所帮助。</p>
<p>本文示例代码以及CookiesUtils代码下载：</p><iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-e532a87883949712.skydrive.live.com/embedrowdetail.aspx/Public/Examples/TerryLee.SetCookiesInSilverlight.zip" frameborder="0" scrolling="no"></iframe>
<p>更多Silverlight 2的文章请参考<a href="http://www.cnblogs.com/Terrylee/archive/2008/07/21/silverlight-2-articles.html">Silverlight 2 相关文章汇总</a>。</p><img src ="http://www.cnblogs.com/Terrylee/aggbug/1252646.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42135/" target="_blank">[新闻]美大学在网上建虚拟校园开门授课</a>]]></description></item><item><title>RadControls for Silverlight发布测试版</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/27/radcontrols-for-silverlight-beta-released.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Sun, 27 Jul 2008 12:25:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/27/radcontrols-for-silverlight-beta-released.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1252742.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/27/radcontrols-for-silverlight-beta-released.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1252742.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1252742.html</trackback:ping><description><![CDATA[摘要:  <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_radcontrols.png" alt=""/></div>RadControls for Silverlight是由telerik推出的一个Silverlight控件集，目前发布了Beta版本，包含的控件有：Menu、MediaPlayer、ProgressBarRadCube、Cube、Slider、Upload、TabControl、NumericUpDown、TreeView等。
<br/>
TreeView控件主要功能有：水平数据绑定、拖拽功能、丰富的键盘支持、节点选择功能、动画效果、丰富的样式支持。Upload控件主要功能有：异步文件上传、多文件上传支持、路由事件处理模型、可配置的服务端处理、进度显示。
<br/>
下面看一下其中几个控件的效果。
&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/07/27/radcontrols-for-silverlight-beta-released.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1252742.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42135/" target="_blank">[新闻]美大学在网上建虚拟校园开门授课</a>]]></description></item><item><title>Silverlight 2 相关文章汇总</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/21/silverlight-2-articles.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Mon, 21 Jul 2008 15:51:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/21/silverlight-2-articles.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1248214.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/21/silverlight-2-articles.html#Feedback</comments><slash:comments>28</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1248214.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1248214.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_silverlight2.gif" alt=""/></div>对自己写的Silverlight 2的相关文章做一下汇总，便于大家直接查找。另外，大家如果有关于Silverlight 2方面的问题，也可以在这里提出，我将尽力为大家解答。
<br/>
1.一步一步学习Silverlight 2系列：主要介绍了Silverlight 2基础，网络与数据访问，图形图像处理、与浏览器的集成等几个方面
<br/>
2.教程文章：实际项目开发中遇到问题的解决，Silverlight 2中技术教程文章。
<br/>
3.技巧诀窍：主要是Silverlight 2在使用过程中的一些小技巧。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/07/21/silverlight-2-articles.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1248214.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42134/" target="_blank">[新闻]JavaScript将成Silverlight的最大对手?</a>]]></description></item><item><title>Silverlight 2中实现Deep Zoom</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/21/implement-deep-zoom-in-silverlight-2.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Mon, 21 Jul 2008 15:28:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/21/implement-deep-zoom-in-silverlight-2.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1248195.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/21/implement-deep-zoom-in-silverlight-2.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1248195.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1248195.html</trackback:ping><description><![CDATA[<h2>概述</h2> <p>对于Deep Zoom想必大家都已经不陌生了，在Silverlight 2 Beta 1时已经提供了支持，并且提供了相应的工具Deep Zoom Composer。Silverlight 2 Beta 2中对于Deep Zoom又有了很大的改进，现在支持基于XML的DeepZoom集合的Manifest文件，Beta2还对DeepZoom加了可扩展的MultiScaleTileSource支持，更新之后的Deep Zoom Composer可以使我们不用编写一行代码直接可视化的生成Deep Zoom应用。</p> <p>本文将简单介绍并分析如何使用Deep Zoom Composer制作Deep Zoom的应用。在开始之前，请先确保安装了如下工具：</p> <p>1.<a href="http://go.microsoft.com/fwlink/?LinkId=120319">Silverlight Tools Beta 2 for Visual Studio 2008</a></p> <p>2.<a href="http://go.microsoft.com/fwlink/?LinkID=120627">Deep Zoom Composer</a></p> <p>总体来说，利用Deep Zoom Composer实现Deep Zoom应用分为如下三个步骤：导入、组合、导出。这三个步骤在打开Deep Zoom Composer之后可以看到：</p> <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="55" alt="TerryLee_0133" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/4bcfb0effccf_13391/TerryLee_0133_6.png" width="377" border="0"> </p> <h2>导入</h2> <p>第一步导入图片，可以点击“Add Image”按钮，一次选择想要导入的图片，如下图所示：</p> <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="440" alt="TerryLee_0134" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/4bcfb0effccf_13391/TerryLee_0134_3.png" width="580" border="0"> </p> <p>导入图片后效果如下图所示：</p> <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="440" alt="TerryLee_0135" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/4bcfb0effccf_13391/TerryLee_0135_3.png" width="580" border="0">&nbsp; </p> <h2>组合</h2> <p>经过了第一步导入图片后，我们可以对图片进行组合，选择需要加入到Deep Zoom应用中的图片，并调整其位置及大小，如果在第一步没有导入图片，同样可以通过“Add Image”按钮来导入。如下图所示：</p> <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="440" alt="TerryLee_0140" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/4bcfb0effccf_13391/TerryLee_0140_3.png" width="580" border="0"> </p> <p>我们方便的对图片的布局等进行调整，如下图所示：</p> <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="440" alt="TerryLee_0141" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/4bcfb0effccf_13391/TerryLee_0141_3.png" width="580" border="0"> </p> <h2>导出</h2> <p>在对图片组合完成后，我们可以进行导出操作，并设置一些导出规则，如应用的名称，导出的路径等，这里Deep Zoom Composer提供了一个非常方便的选项，我们可以直接导出图片及生成Silverlight项目，如下图所示：</p> <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="440" alt="TerryLee_0142" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/4bcfb0effccf_13391/TerryLee_0142_3.png" width="580" border="0"> </p> <h2>效果</h2> <p>经过以上三步之后，就可以直接生成Deep Zoom应用了，不用编写一行代码，生成的Silverlight项目结构如下：</p> <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="357" alt="TerryLee_0143" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/4bcfb0effccf_13391/TerryLee_0143_3.png" width="366" border="0"> </p> <p>可以直接打开DeepZoomProjectTestPage.html查看最终的效果，如下所示：</p><iframe style="width: 580px; height: 420px" src="http://silverlight.services.live.com/invoke/40565/MyAlbum/iframe.html" frameborder="0"></iframe> <h2>实际应用</h2> <p>新浪音乐在微软 4 月 14 日 “Silverlight 锋芒彰显” 发布会中展示了新浪音乐最新的乐库原型，其中应用了 Silverlight 中的 Deep Zoom 技术。更详细的情形大家可以参考这篇文章中的视频：</p> <p><a href="https://blogs.msdn.com/jijia/archive/2008/04/16/sina-musicmap-details.aspx">新浪音乐地图之 Deep Zoom 应用</a></p> <h2>结束语</h2> <p>本文简单的介绍了在Silverlight 2中实现Deep Zoom的应用，希望对大家有所帮助。 </p><img src ="http://www.cnblogs.com/Terrylee/aggbug/1248195.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42134/" target="_blank">[新闻]JavaScript将成Silverlight的最大对手?</a>]]></description></item><item><title>三套Silverlight 2 Beta 2的控件样式</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/20/three-silverlight-2-beta-2-control-style.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Sun, 20 Jul 2008 15:45:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/20/three-silverlight-2-beta-2-control-style.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1247253.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/20/three-silverlight-2-beta-2-control-style.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1247253.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1247253.html</trackback:ping><description><![CDATA[<p><a href="http://blogs.msdn.com/corrinab/archive/tags/Corrina+Barber/default.aspx">Corrina Barber</a>在Silverlight 2 Beta 1的时候就完成了<a href="http://blogs.msdn.com/corrinab/archive/2008/03/11/silverlight-2-control-skins.aspx">四套非常酷的控件样式</a>，这些样式我曾经在个人博客中<a href="http://www.cnblogs.com/Terrylee/archive/2008/03/13/great-new-silverlight-control-skins.html">推荐</a>过。当Silverlight 2升级到Beta 2时，由于引入了视觉状态管理机制，这些样式已经不能再使用。<a href="http://blogs.msdn.com/corrinab/archive/tags/Corrina+Barber/default.aspx">Corrina Barber</a>在第一时间将其中的两套样式<a href="http://blogs.msdn.com/corrinab/archive/2008/06/16/8602865.aspx">升级</a>到了Silverlight 2 Beta 2下，如下图所示：</p> <p>名称：Flat&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.corrina_b.members.winisp.net/skinsb2/flat/flatStyleProject.zip">下载</a> | <a href="http://www.corrina_b.members.winisp.net/skinsb2/flat/default.html">效果</a></p> <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="558" alt="TerryLee_0128" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/Silverlight2Beta2_14944/TerryLee_0128_3.png" width="560" border="0"> </p> <p>名称：Red&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.corrina_b.members.winisp.net/skinsb2/red/redStyleProject.ziphttp">下载</a> | <a href="://www.corrina_b.members.winisp.net/skinsb2/red/default.html">效果</a></p> <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="558" alt="TerryLee_0129" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/Silverlight2Beta2_14944/TerryLee_0129_3.png" width="560" border="0"> </p> <p>在Silverlight 2 Beta 1时，我在项目中使用了Bubbly样式，于是给<a href="http://blogs.msdn.com/corrinab/archive/tags/Corrina+Barber/default.aspx">Corrina Barber</a>发信，希望她能提供Bubbly样式的升级版本，由于此前<a href="http://blogs.msdn.com/corrinab/archive/tags/Corrina+Barber/default.aspx">Corrina Barber</a>非常忙，在本周末时，她终于完成了Bubbly样式的升级，并在第一时间发到了我的邮箱中，非常感谢<a href="http://blogs.msdn.com/corrinab/archive/tags/Corrina+Barber/default.aspx">Corrina Barber</a>。Bubbly样式的效果如下：</p> <p>名称：Bubbly&nbsp;&nbsp;&nbsp; <a href="http://www.corrina_b.members.winisp.net/SkinsB2/Bubbly/BubblyStyleProject.zip">下载</a> | <a href="http://www.corrina_b.members.winisp.net/SkinsB2/Bubbly/default.html">效果</a></p> <p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="567" alt="TerryLee_0130" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/Silverlight2Beta2_14944/TerryLee_0130_3.png" width="560" border="0">&nbsp;</p> <p>更多的信息大家可以参考<a href="http://blogs.msdn.com/corrinab/archive/tags/Corrina+Barber/default.aspx">Corrina Barber</a>的两篇文章：</p> <p><a href="http://blogs.msdn.com/corrinab/archive/2008/07/20/8757236.aspx">Bubbly Skin Updated for Beta 2</a></p> <p><a href="http://blogs.msdn.com/corrinab/archive/2008/06/16/8602865.aspx">Red and Flat Skins Updated for Beta 2</a></p> <p>最后再次感谢<a href="http://blogs.msdn.com/corrinab/archive/tags/Corrina+Barber/default.aspx">Corrina Barber</a>给我们带来如此漂亮的控件样式。</p><img src ="http://www.cnblogs.com/Terrylee/aggbug/1247253.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42133/" target="_blank">[新闻]没有谷歌就活不下去的四个网站</a>]]></description></item><item><title>Silverlight 2应用程序中XAP文件揭秘</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/11/xap-file-revelation-in-silverlight-2.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Fri, 11 Jul 2008 14:56:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/11/xap-file-revelation-in-silverlight-2.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1241152.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/11/xap-file-revelation-in-silverlight-2.html#Feedback</comments><slash:comments>37</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1241152.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1241152.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_silverlight2.gif" alt=""/></div>XAP文件是Silverlight 2应用程序编译打包后的一个文件，它是一个标准的zip压缩文件，包括了Silverlight 2应用程序所需的一切文件，如程序集、资源文件等。本文将对Silverlight中的XAP文件进行详细的说明。
1.XAP文件是什么
2.如何使用XAP文件
3.XAP文件如何执行
4.XAP文件包含什么
5.XAP文件如何生成&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/07/11/xap-file-revelation-in-silverlight-2.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1241152.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42132/" target="_blank">[新闻]Google 10周岁生日</a>]]></description></item><item><title>技巧：在Silverlight中如何访问外部xap文件中UserControl</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/10/access-usercontrol-in-external-xap-file-from-silverlight-2.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Thu, 10 Jul 2008 14:10:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/10/access-usercontrol-in-external-xap-file-from-silverlight-2.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1240297.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/10/access-usercontrol-in-external-xap-file-from-silverlight-2.html#Feedback</comments><slash:comments>37</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1240297.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1240297.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_silverlight2.gif" alt=""/></div>众所周知，在Silverlight 2开始每个项目编译后都会打包成为一个xap文件，如果我们要访问当前xap文件中的UserControl比较容易，那我们如何访问一个外部xap文件中的内容呢？甚至于如何访问一个互联网上的xap文件呢？<br><br>本文将介绍在Silverlight中如何访问外部xap文件中UserControl。<br><br/>&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/07/10/access-usercontrol-in-external-xap-file-from-silverlight-2.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1240297.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42131/" target="_blank">[新闻]祝Google 10周岁生日快乐</a>]]></description></item><item><title>技巧：Silverlight应用程序中如何获取ASP.NET页面参数</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/09/tips-get-parameters-from-aspnet-page.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Wed, 09 Jul 2008 15:49:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/09/tips-get-parameters-from-aspnet-page.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1239609.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/09/tips-get-parameters-from-aspnet-page.html#Feedback</comments><slash:comments>42</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1239609.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1239609.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_silverlight2.gif" alt=""/></div>在开发Silverlight应用程序时，我们经常会遇到这样一种情况，需要在Silverlight应用程序的UserControl中获取ASP.NET页面参数，这个参数不一定来自于当前Silverlight应用程序的宿主页面，而有可能来自于其它的ASP.NET页面。<br><br>本文我们简单的介绍一下如何在Silverlight应用程序中获取ASP.NET页面参数。<br><br/>&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/07/09/tips-get-parameters-from-aspnet-page.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1239609.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42130/" target="_blank">[新闻]Google十年市值达1500亿美元 创造奇迹</a>]]></description></item><item><title>谈谈Silverlight 2中的视觉状态管理 Part1</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/08/silverlight-2-visual-state-manager-part-1.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Tue, 08 Jul 2008 13:11:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/08/silverlight-2-visual-state-manager-part-1.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1238458.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/08/silverlight-2-visual-state-manager-part-1.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1238458.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1238458.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_silverlight2.gif" alt=""/></div>在WPF和Silverlight中的控件模板支持自定义控件的观感，所谓的外观，指控件的视觉效果；而感觉则是控件交互的响应性，如在控件上按下鼠标、控件获得焦点等状态的改变。微软在Silverlight 2 Beta 2中引进了一个新的概念视觉状态管理（Visual State Manager），为我们创建交互性的控件模板提供了极大的方便。接下来我将会用几篇文章来介绍一下Silverlight 2中的视觉状态管理。<br><br>在定义控件时，我们需要严格区分控件的视觉效果和控件的逻辑，这样当我们修改控件外观时将不会影响控件逻辑。Silverlight 2 Beta 2中提出的部件和状态模型，能够很好的解决这一问题，本文我们先来看一些基本的概念。<br>&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/07/08/silverlight-2-visual-state-manager-part-1.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1238458.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42129/" target="_blank">[新闻]GMail:回过头来支持IE6</a>]]></description></item><item><title>技巧：在Silverlight 2应用程序中切换用户控件</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/02/tip-switch-usercontrol-in-silverlight-2-application.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Wed, 02 Jul 2008 13:28:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/02/tip-switch-usercontrol-in-silverlight-2-application.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1234295.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/02/tip-switch-usercontrol-in-silverlight-2-application.html#Feedback</comments><slash:comments>24</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1234295.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1234295.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_silverlight2.gif" alt=""/></div>大家都知道，在Silverlight 2应用程序中，每个应用程序将生成一个xap文件，每一个xap文件中只能设置一个起始的用户控件。如果我们有多个用户控件，需要在不同的ASP.NET页面中加载，最简单的方法莫过于针对多个用户控件分别建立对应的Silverlight项目，但这种方式有很多的缺点，如我们的样式文件需要在多个项目中进行拷贝。<br><br>本文将介绍利用初始化参数进行用户控件的切换这一技巧。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/07/02/tip-switch-usercontrol-in-silverlight-2-application.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1234295.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42128/" target="_blank">[新闻]Google十年大变样</a>]]></description></item><item><title>[贴图]博客园T恤男士版</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/02/1233661.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Tue, 01 Jul 2008 16:20:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/02/1233661.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1233661.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/02/1233661.html#Feedback</comments><slash:comments>79</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1233661.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1233661.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_cnblogstshirt.png" alt=""/></div><br>自从《2008博客园T恤正式发布》之后，昨天终于收到了博客园的T恤，今天迫不及待的跟公司里博客园的兄弟拍了几张“帅照”，这里跟大家分享一下:)<br><br/><br><br/>&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/07/02/1233661.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1233661.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42128/" target="_blank">[新闻]Google十年大变样</a>]]></description></item><item><title>在Silverlight 2应用程序中集成Virtual Earth</title><link>http://www.cnblogs.com/Terrylee/archive/2008/07/01/integrate-virtual-earth-in-silverlight-2.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Tue, 01 Jul 2008 13:52:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/07/01/integrate-virtual-earth-in-silverlight-2.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1233572.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/07/01/integrate-virtual-earth-in-silverlight-2.html#Feedback</comments><slash:comments>39</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1233572.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1233572.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_virtualearth.png" alt=""/></div>Virtual Earth是什么，我想不用多做解释了。微软在推出自己的Virtual Earth之后，开放了大量的APIs，使得我们可以方便集成到自己的应用程序中。<br>本文将介绍如何在自己的Silverlight 2应用程序中集成Virtual Earth，主要包括两部分内容：<br>1.在HTML中集成Virtual Earth<br>2.在Silverlight中集成Virtual Earth<br>&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/07/01/integrate-virtual-earth-in-silverlight-2.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1233572.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42127/" target="_blank">[新闻]谷歌十年创新路</a>]]></description></item><item><title>Composite Application Guidance for WPF RC1发布</title><link>http://www.cnblogs.com/Terrylee/archive/2008/06/29/Composite-Application-Guidance-for-WPF-RC1-Released.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Sun, 29 Jun 2008 10:48:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/06/29/Composite-Application-Guidance-for-WPF-RC1-Released.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1232078.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/06/29/Composite-Application-Guidance-for-WPF-RC1-Released.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1232078.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1232078.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_p_p.gif" alt=""/></div>Composite Application Guidance for WPF是微软模式与实践小组推出的又一个开发指导包，用来指导我们更加容易的构建企业级WPF客户端应用程序，分离复杂的WPF应用程序为多个独立的模块，交给多个部门的开发者完成，每个部门负责一块开发，最后可以无缝的集成为一个完整的应用程序。主要有如下几个部分构成：参考实现、复杂应用程序类库、快速入门指导、文档等，类似于Web Client Software Factory。<br><br/><br><br/>&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/06/29/Composite-Application-Guidance-for-WPF-RC1-Released.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1232078.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42126/" target="_blank">[新闻]十年回顾：Google的互联网经济</a>]]></description></item><item><title>详解Silverlight 2中的独立存储（Isolated Storage）</title><link>http://www.cnblogs.com/Terrylee/archive/2008/06/29/silverlight-2-beta-2-isolated-storage.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Sat, 28 Jun 2008 18:19:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/06/29/silverlight-2-beta-2-isolated-storage.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1231853.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/06/29/silverlight-2-beta-2-isolated-storage.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1231853.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1231853.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_silverlight2.gif" alt=""/></div>独立存储（Isolated Storage）是Silverlight 2中提供的一个客户端安全的存储，它是一个与Cookie机制类似的局部信任机制。独立存储机制的APIs 提供了一个虚拟的文件系统和可以访问这个虚拟文件系统的数据流对象。Silverlight中的独立存储是基于 .NET Framework中的独立存储来建立的，所以它仅仅是.NET Framework中独立存储的一个子集。<br>1.使用独立存储<br>2.增加配额<br>3.文件存在何处<br>4.禁用独立存储<br>5.独立存储配置&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/06/29/silverlight-2-beta-2-isolated-storage.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1231853.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42126/" target="_blank">[新闻]十年回顾：Google的互联网经济</a>]]></description></item><item><title>在Silverlight 2中实现超酷图表</title><link>http://www.cnblogs.com/Terrylee/archive/2008/06/21/1227371.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Sat, 21 Jun 2008 08:02:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/06/21/1227371.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1227371.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/06/21/1227371.html#Feedback</comments><slash:comments>86</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1227371.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1227371.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_chart.png" alt=""/></div>Silverlight对于图形图像处理方面，从1.0时代起就给予了很强大的支持，所以我们可以在Silverlight中实现非常棒的各种统计图表，然而现在有了一些开源的项目，使得这项工作更加的简单。<br><br>本文我将介绍一个开源项目visifire，使用它可以在Silverlight 2中实现超酷的图表。<br><br/>&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/06/21/1227371.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1227371.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42123/" target="_blank">[新闻]Google 10周年大事记</a>]]></description></item><item><title>Silverlight 2中多语言支持实现（下）</title><link>http://www.cnblogs.com/Terrylee/archive/2008/06/19/localization-in-silverlight-2-beta-2-part2.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Thu, 19 Jun 2008 15:00:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/06/19/localization-in-silverlight-2-beta-2-part2.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1226237.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/06/19/localization-in-silverlight-2-beta-2-part2.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1226237.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1226237.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_silverlight2.gif" alt=""/></div>最近项目要在Silverlight 2应用程序中实现本地化，原以为这个过程非常简单，却没想到实现的时候一波三折，好在结果还算不错。需求是这样的，用户第一次访问的时候，默认为英文，当用户选择一种显示语言后，记录在本地，下次用户访问时直接显示已经选择的语言。现在我把整个实现的过程记录下来，希望对大家有所帮助。 <br><br>本文为Silverlight 2中多语言支持实现第二部分。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/06/19/localization-in-silverlight-2-beta-2-part2.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1226237.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42122/" target="_blank">[新闻]Google上下二十年</a>]]></description></item><item><title>Silverlight 2中多语言支持实现（上）</title><link>http://www.cnblogs.com/Terrylee/archive/2008/06/19/localization-in-silverlight-2-beta-2-part1.html</link><dc:creator>TerryLee</dc:creator><author>TerryLee</author><pubDate>Wed, 18 Jun 2008 17:05:00 GMT</pubDate><guid>http://www.cnblogs.com/Terrylee/archive/2008/06/19/localization-in-silverlight-2-beta-2-part1.html</guid><wfw:comment>http://www.cnblogs.com/Terrylee/comments/1225088.html</wfw:comment><comments>http://www.cnblogs.com/Terrylee/archive/2008/06/19/localization-in-silverlight-2-beta-2-part1.html#Feedback</comments><slash:comments>35</slash:comments><wfw:commentRss>http://www.cnblogs.com/Terrylee/comments/commentRss/1225088.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Terrylee/services/trackbacks/1225088.html</trackback:ping><description><![CDATA[摘要: <div style="float:right;padding-right:5px;"><img src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/120066/o_silverlight2.gif" alt=""/></div>最近项目要在Silverlight 2应用程序中实现本地化，原以为这个过程非常简单，却没想到实现的时候一波三折，好在结果还算不错。需求是这样的，用户第一次访问的时候，默认为英文，当用户选择一种显示语言后，记录在本地，下次用户访问时直接显示已经选择的语言。现在我把整个实现的过程记录下来，希望对大家有所帮助。<br><br>本文为Silverlight 2中多语言支持实现第一部分。&nbsp;&nbsp;<a href='http://www.cnblogs.com/Terrylee/archive/2008/06/19/localization-in-silverlight-2-beta-2-part1.html'>阅读全文</a><img src ="http://www.cnblogs.com/Terrylee/aggbug/1225088.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42122/" target="_blank">[新闻]Google上下二十年</a>]]></description></item></channel></rss>