<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/blogyuan" type="application/rss+xml" ref="self"></atom:link><fs:self_link href="http://feed.feedsky.com/blogyuan" type="application/rss+xml"></fs:self_link><lastBuildDate>Fri, 04 Jul 2008 17:29:00 GMT</lastBuildDate><title>博客园-首页原创区</title><description>专注于.NET技术</description><link>http://www.cnblogs.com/</link><language>zh-cn</language><pubDate>Fri, 04 Jul 2008 18:50:45 GMT</pubDate><dc:date>2008-07-04T18:50:45Z</dc:date><dc:language>zh-cn</dc:language><item><title>Silverlight 之模态对话框的通用模拟</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90107841/4050094/1/item.html</link><wfw:comment>http://RChen.cnblogs.com/comments/1236046.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://RChen.cnblogs.com/comments/commentRss/1236046.html</wfw:commentRss><trackback:ping>http://RChen.cnblogs.com/services/trackbacks/1236046.html</trackback:ping><description>摘要: &lt;p&gt;&lt;img src=&quot;/images/cnblogs_com/RChen/WindowsLiveWriter/Silverlight_175E/modaldialog2_2.jpg&quot; width=&quot;100&quot; align=&quot;right&quot;/&gt;Silverlight 给我们带来了如同 Winform 一样便捷的开发方式，然而在桌面应用程序中一个非常重要的元素——模态对话框，却不具备。
&lt;br&gt;本文提供了一个简单的封装，以便更方便的实现模态对话框主/从调用的场景。
&lt;br&gt;&lt;/p&gt;&amp;nbsp;&amp;nbsp;&lt;a href='http://www.cnblogs.com/RChen/archive/2008/07/05/1236046.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://RChen.cnblogs.com/aggbug/1236046.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37528/&quot; target=&quot;_blank&quot;&gt;[新闻]《福布斯》:暴雪的新一波完美风暴已经到来&lt;/a&gt;</description><pubDate>Sat, 05 Jul 2008 01:29:00 +0800</pubDate><author>木野狐(Neil Chen)</author><comments>http://www.cnblogs.com/RChen/archive/2008/07/05/1236046.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/RChen/archive/2008/07/05/1236046.html</guid><dc:creator>木野狐(Neil Chen)</dc:creator><fs:srclink>http://www.cnblogs.com/RChen/archive/2008/07/05/1236046.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90107841/4050094</fs:itemid></item><item><title>《当老温遭遇C#》之网络棋牌游戏系统架构篇【附演示+代码+全套图】~~极力推荐C#程序员阅读</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90099142/4050094/1/item.html</link><wfw:comment>http://wenweifeng.cnblogs.com/comments/1236001.html</wfw:comment><slash:comments>29</slash:comments><wfw:commentRss>http://wenweifeng.cnblogs.com/comments/commentRss/1236001.html</wfw:commentRss><trackback:ping>http://wenweifeng.cnblogs.com/services/trackbacks/1236001.html</trackback:ping><description>摘要: 老温评语：在我写这篇文章之前,我的心情比较沉重,不知道会不会影响我现在的写作情绪,之前由于我发表了几篇文章而大受欢迎同时也有网友对我进行炮轰,认为我是在炒作.我真的感到非常悲哀,我真的是撞猪上了;而且给Brain看到了顺便笑了我一把！苍天啊,上帝啊，佛祖啊.但话又说回来没有风雨怎么能见彩虹,一定要保持乐观精神，引用伟大领袖毛主席的话：一切反动派都是纸老虎！我相信只要用事实说话,那么是金子就一定会发&amp;nbsp;&amp;nbsp;&lt;a href='http://www.cnblogs.com/wenweifeng/archive/2008/07/05/1236001.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://wenweifeng.cnblogs.com/aggbug/1236001.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37527/&quot; target=&quot;_blank&quot;&gt;[新闻]中国互联网公司在哪儿&lt;/a&gt;</description><pubDate>Sat, 05 Jul 2008 00:07:00 +0800</pubDate><author>老温博客</author><comments>http://www.cnblogs.com/wenweifeng/archive/2008/07/05/1236001.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/wenweifeng/archive/2008/07/05/1236001.html</guid><dc:creator>老温博客</dc:creator><fs:srclink>http://www.cnblogs.com/wenweifeng/archive/2008/07/05/1236001.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90099142/4050094</fs:itemid></item><item><title>疯狂使用yield实现模拟多线程</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90099156/4050094/1/item.html</link><wfw:comment>http://runner-mei.cnblogs.com/comments/1235785.html</wfw:comment><slash:comments>2</slash:comments><wfw:commentRss>http://runner-mei.cnblogs.com/comments/commentRss/1235785.html</wfw:commentRss><trackback:ping>http://runner-mei.cnblogs.com/services/trackbacks/1235785.html</trackback:ping><description>摘要: 我们知道yield return可以用来生成迭代器,它的原理是将函数的调用堆栈保存起来,并在下一次调用迭代器的MoveNext()方法时恢复堆栈以继续运行.那么我们在调用一个对象上的阻塞io操作时,可以通过yield return来保存调用堆栈,当阻塞io操作可以继续时,就恢复堆栈继续运行.下面用一个例子来说明假设写一个回显服务器用多线程实现如下Code highlighting produced&amp;nbsp;&amp;nbsp;&lt;a href='http://www.cnblogs.com/runner-mei/archive/2008/07/05/1235785.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://runner-mei.cnblogs.com/aggbug/1235785.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37526/&quot; target=&quot;_blank&quot;&gt;[新闻]微软:Silverlight内容也可被搜索引擎检索&lt;/a&gt;</description><pubDate>Sat, 05 Jul 2008 00:05:00 +0800</pubDate><author>runner.mei</author><comments>http://www.cnblogs.com/runner-mei/archive/2008/07/05/1235785.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/runner-mei/archive/2008/07/05/1235785.html</guid><dc:creator>runner.mei</dc:creator><fs:srclink>http://www.cnblogs.com/runner-mei/archive/2008/07/05/1235785.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90099156/4050094</fs:itemid></item><item><title>在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 1)</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90087413/4050094/1/item.html</link><wfw:comment>http://entlibforum.cnblogs.com/comments/1235988.html</wfw:comment><slash:comments>3</slash:comments><wfw:commentRss>http://entlibforum.cnblogs.com/comments/commentRss/1235988.html</wfw:commentRss><trackback:ping>http://entlibforum.cnblogs.com/services/trackbacks/1235988.html</trackback:ping><description>&lt;div align=&quot;center&quot;&gt;&lt;strong&gt;在.NET 3.5 &lt;/strong&gt;&lt;strong&gt;平台上使用LINQ to SQL&lt;/strong&gt;&lt;strong&gt;创建三层/&lt;/strong&gt;&lt;strong&gt;多层Web&lt;/strong&gt;&lt;strong&gt;应用系统 (Part 1)&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;在新的.Net Framework 3.5平台上，Microsoft发布了LINQ（C# 3.0, VB.Net 9.0）-集成语言查询（Language-Integrated Query），也就是通过编程语言来查询数据：&lt;/div&gt;
&lt;ul&gt;
    &lt;li&gt;数据库 (LINQ to SQL) &lt;/li&gt;
    &lt;li&gt;DataSet 数据集(LINQ to Dataset) &lt;/li&gt;
    &lt;li&gt;XML文档 (LINQ to XML)&amp;nbsp; &lt;/li&gt;
    &lt;li&gt;实体对象 (LINK to Entities) &lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;本文将演示如何在ASP.NET 3.0平台上，使用LINQ to SQL构建多层的Web应用程序。在当前的编程领域中，创建N-Tier应用程序成为一般的要求，且.NET Framework 提供了灵活的支持。一般而言，N-Tier应用程序有如下几个层：1. 表示层；2. 业务逻辑层；3. 数据访问层；4. 数据库层。每一层均完成特定的任务。本篇文章中介绍的架构和经典的N-Tier相似，不过数据库层替换新的DataLinq 层，使用LINQ to SQL 完成数据操作。&lt;br /&gt;
&lt;img height=&quot;435&quot; alt=&quot;&quot; src=&quot;http://forum.entlib.com/useruploadfiles/jacky/image/asp_net_linq/LINQ_N_Tier_Architecture.jpg&quot; width=&quot;607&quot; /&gt;&lt;/div&gt;
&lt;div&gt;图1.1：基于LINQ to SQL的N-Tier架构&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 14pt&quot;&gt;架构思考&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;如果你有大型ASP.NET项目的经历，你可能会注意到更多的时间花在写组件代码，而不是Web页面代码。有时，组件的设计和管理成为一个费时的过程，你可能正遇到架构方面的问题-寻找最好的方式来设计Web应用程序。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;我写这篇文章的想法是介绍一个好的设计模式，并不是得到一个结论或者声明这是一个最好的N-Tier应用程序的设计模式。因为对于架构设计，每一个开发人员总是有自己的观点，所以任何合适的架构阐述都是有争议的。然而，如图1.1所示，分离不同的代码到不同的层总是一个好的实践。按这样组织代码，可以更方便地维护和扩展应用程序。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;在图1.1中，你可以看到业务组件分割到不同的层。组织代码最好的方法是为每一个业务组件创建不同的类库（Class Library）。Visual Studio允许在同一个Solution中创建多个项目。因此，我们可以在同一个Solution中加入ASP.NET 应用程序和类库Class Library项目。当你在编译Solution时，每一个项目都会生成在bin目录下生成一个assembly程序集文件。方法1：我们可以手动复制.DLL文件到应用程序的bin目录。方法2：增加项目引用。当你编译Solution时，第二种方法可以自动更新应用程序bin目录的程序集文件。通过这种方式组织代码，可以更容易修改/更新项目的特定代码，也容易从不同的Server上迁移代码。我不想深入探讨架构，这里我通过截屏来解释如何实现。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;假定你已经具备经典3层架构应用程序的设计经验，我告诉你如何建立层与层之间的引用关系，接着你可以自己建立项目引用。图1.1上的箭头符号说明了不同层之间的交互。说明如下：&lt;/div&gt;
&lt;div&gt;(1) 数据访问层引用Data Linq 层（&lt;a href=&quot;http://www.entlib.com/&quot;&gt;&lt;font color=&quot;#800080&quot;&gt;EntLib.com &lt;span&gt;&lt;span&gt;开源小组注&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/a&gt;： 原文说还需要引用业务外观（Business Facade）层，原文有误）。&lt;/div&gt;
(2) 业务外观（Business Facade）层引用Data Linq 层和数据访问层，因为业务外观层使用Data Linq层的业务实体来创建表实体（后面进行详细讨论），同时调用数据访问层的方法。&lt;br /&gt;
(3) 表现层引用Data Linq层和业务外观层。
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;http://www.entlib.com/&quot;&gt;&lt;font color=&quot;#800080&quot;&gt;EntLib.com &lt;span&gt;&lt;span&gt;开源小组注&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/a&gt;：本文翻译《&lt;a href=&quot;http://forum.entlib.com/default.aspx?g=posts&amp;amp;t=91&quot;&gt;&lt;font color=&quot;#800080&quot;&gt;Building Multi-Tier Web Application in .NET 3.5 Framework Using LINQ to SQL&lt;/font&gt;&lt;/a&gt;》。后面内容待续。欢迎交流LINQ相关技术。&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;img src =&quot;http://entlibforum.cnblogs.com/aggbug/1235988.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37525/&quot; target=&quot;_blank&quot;&gt;[新闻]内置AI技术 三星聪明微波炉还能上网&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 23:15:00 +0800</pubDate><author>EntLib</author><comments>http://www.cnblogs.com/entlibforum/archive/2008/07/04/1235988.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/entlibforum/archive/2008/07/04/1235988.html</guid><dc:creator>EntLib</dc:creator><fs:srclink>http://www.cnblogs.com/entlibforum/archive/2008/07/04/1235988.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90087413/4050094</fs:itemid></item><item><title>一个自己写的组件--异常报告(3):开发一个异常处理程序</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90083846/4050094/1/item.html</link><wfw:comment>http://Thriving-Country.cnblogs.com/comments/1235963.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://Thriving-Country.cnblogs.com/comments/commentRss/1235963.html</wfw:commentRss><trackback:ping>http://Thriving-Country.cnblogs.com/services/trackbacks/1235963.html</trackback:ping><description>摘要: 上文中我对异常报告组件进行了重构和配置，实际上在上文中MyDebuger组件就已经完成了。我在设计这个组件时考虑到了它的扩展性，其中一个重要的扩展就是可以定义新的异常处理程序模块之后通过配置与主程序一起工作。这节我就开发一个简单的异常处理程序，之后进行配置实现写日志到文件系统。&amp;nbsp;&amp;nbsp;&lt;a href='http://www.cnblogs.com/Thriving-Country/archive/2008/07/04/1235963.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://Thriving-Country.cnblogs.com/aggbug/1235963.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37524/&quot; target=&quot;_blank&quot;&gt;[新闻]盛大设文学公司 原新浪博客负责人侯小强任CEO&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 22:37:00 +0800</pubDate><author>thriving.country</author><comments>http://www.cnblogs.com/Thriving-Country/archive/2008/07/04/1235963.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/Thriving-Country/archive/2008/07/04/1235963.html</guid><dc:creator>thriving.country</dc:creator><fs:srclink>http://www.cnblogs.com/Thriving-Country/archive/2008/07/04/1235963.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90083846/4050094</fs:itemid></item><item><title>【原创、开源】续与纠正：几个 JavaScript “类”(Calendar、Ajax、PPLive、Text、ToolTip、Xml 等)</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90049153/4050094/1/item.html</link><wfw:comment>http://howard-queen.cnblogs.com/comments/1235920.html</wfw:comment><slash:comments>2</slash:comments><wfw:commentRss>http://howard-queen.cnblogs.com/comments/commentRss/1235920.html</wfw:commentRss><trackback:ping>http://howard-queen.cnblogs.com/services/trackbacks/1235920.html</trackback:ping><description>摘要:  上篇文章得到了几位兄台的鼓励，也得到不少朋友的关注；考虑到这些和程序员的“职业道德”，我便以最快的速度把源码中的重大错误在这里进行纠正，并向关心、下载了的朋友表达&amp;nbsp;&amp;nbsp;&lt;a href='http://www.cnblogs.com/howard-queen/archive/2008/07/04/1235920.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://howard-queen.cnblogs.com/aggbug/1235920.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37523/&quot; target=&quot;_blank&quot;&gt;[新闻]Gmail、Hotmail和Yahoo验证码被攻破&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 20:01:00 +0800</pubDate><author>陛下</author><comments>http://www.cnblogs.com/howard-queen/archive/2008/07/04/1235920.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/howard-queen/archive/2008/07/04/1235920.html</guid><dc:creator>陛下</dc:creator><fs:srclink>http://www.cnblogs.com/howard-queen/archive/2008/07/04/1235920.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90049153/4050094</fs:itemid></item><item><title>ASP.NET中进行消息处理(MSMQ) 三</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90049154/4050094/1/item.html</link><wfw:comment>http://beniao.cnblogs.com/comments/1234352.html</wfw:comment><slash:comments>5</slash:comments><wfw:commentRss>http://beniao.cnblogs.com/comments/commentRss/1234352.html</wfw:commentRss><trackback:ping>http://beniao.cnblogs.com/services/trackbacks/1234352.html</trackback:ping><description>摘要: 在PetShop 4.0中，利用消息队列临时存放要插入的数据，来避免因为频繁访问数据库的操作。而队列中的消息，则等待系统的专用的应用程序来处理，最后将数据插入到数据库中。&amp;nbsp;&amp;nbsp;&lt;a href='http://www.cnblogs.com/beniao/archive/2008/07/04/1234352.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://beniao.cnblogs.com/aggbug/1234352.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37520/&quot; target=&quot;_blank&quot;&gt;[新闻]史玉柱称花掉8亿美元不容易 坚持谨慎投资原则&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 19:43:00 +0800</pubDate><author>Bēniaǒ</author><comments>http://www.cnblogs.com/beniao/archive/2008/07/04/1234352.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/beniao/archive/2008/07/04/1234352.html</guid><dc:creator>Bēniaǒ</dc:creator><fs:srclink>http://www.cnblogs.com/beniao/archive/2008/07/04/1234352.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90049154/4050094</fs:itemid></item><item><title>Timus 1013. K-based numbers. Version 3</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90049155/4050094/1/item.html</link><wfw:comment>http://skyivben.cnblogs.com/comments/1235062.html</wfw:comment><slash:comments>1</slash:comments><wfw:commentRss>http://skyivben.cnblogs.com/comments/commentRss/1235062.html</wfw:commentRss><trackback:ping>http://skyivben.cnblogs.com/services/trackbacks/1235062.html</trackback:ping><description>摘要: Timus 1013. K-based numbers. Version 3 要求计算出不包括相邻的零的 N 位 K-进制数共有多少个。&amp;nbsp;&amp;nbsp;&lt;a href='http://www.cnblogs.com/skyivben/archive/2008/07/04/1235062.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://skyivben.cnblogs.com/aggbug/1235062.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37519/&quot; target=&quot;_blank&quot;&gt;[新闻]我乐网(56.com)关停1月 套牢2亿风投&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 19:22:00 +0800</pubDate><author>银河</author><comments>http://www.cnblogs.com/skyivben/archive/2008/07/04/1235062.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/skyivben/archive/2008/07/04/1235062.html</guid><dc:creator>银河</dc:creator><fs:srclink>http://www.cnblogs.com/skyivben/archive/2008/07/04/1235062.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90049155/4050094</fs:itemid></item><item><title>用Grid和GridSplitter布局和分割WPF窗口</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90039272/4050094/1/item.html</link><wfw:comment>http://khler.cnblogs.com/comments/1235619.html</wfw:comment><slash:comments>3</slash:comments><wfw:commentRss>http://khler.cnblogs.com/comments/commentRss/1235619.html</wfw:commentRss><trackback:ping>http://khler.cnblogs.com/services/trackbacks/1235619.html</trackback:ping><description>摘要:     在C++/MFC中一般都有比较成熟的主窗口分割策略，但对于当前使用人数不多的新技术——WPF，很多技术还需要更多人加入其中，讨论一些比较实际的应用，主窗口分割就是其中比较常见的问题。本文将对此进行应用方面的探讨，并附带给出源码和截图，方便大家学习和研究。&amp;nbsp;&amp;nbsp;&lt;a href='http://www.cnblogs.com/khler/archive/2008/07/04/1235619.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://khler.cnblogs.com/aggbug/1235619.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37518/&quot; target=&quot;_blank&quot;&gt;[新闻]微软七月安全公告预告:四个重要等级更新&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 18:06:00 +0800</pubDate><author>He,YuanHui - khler</author><comments>http://www.cnblogs.com/khler/archive/2008/07/04/1235619.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/khler/archive/2008/07/04/1235619.html</guid><dc:creator>He,YuanHui - khler</dc:creator><fs:srclink>http://www.cnblogs.com/khler/archive/2008/07/04/1235619.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90039272/4050094</fs:itemid></item><item><title>Silverlight 数据绑定学习笔记 (2)：Source to Target</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90026053/4050094/1/item.html</link><wfw:comment>http://RChen.cnblogs.com/comments/1235816.html</wfw:comment><slash:comments>2</slash:comments><wfw:commentRss>http://RChen.cnblogs.com/comments/commentRss/1235816.html</wfw:commentRss><trackback:ping>http://RChen.cnblogs.com/services/trackbacks/1235816.html</trackback:ping><description>&lt;P&gt;接着&lt;A href=&quot;/RChen/archive/2008/07/03/1235039.html&quot; target=_blank&gt;上一篇&lt;/A&gt;，在 Silverlight 中支持3种绑定：OneWay, TwoWay, OneTime. 默认是 OneWay.&lt;/P&gt;
&lt;P&gt;其中 OneWay 表示仅仅从数据源绑定到目标(通常是 UI 对象)，单向的；&lt;/P&gt;
&lt;P&gt;TwoWay 表示既可以从数据源绑定到目标，目标的更改也可以反馈给数据源，使其发生更新。&lt;/P&gt;
&lt;P&gt;而 OneTime 是 OneWay 的一种特例，仅加载一次数据。随后数据的变更不会通知绑定目标对象。这样，可以带来更好的性能。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;绑定的语法可以用大括号表示，下面是几个例子：&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;FONT-SIZE: 9pt&quot;&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: rgb(128,0,0)&quot;&gt;TextBlock&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(255,0,0)&quot;&gt;Text&lt;/SPAN&gt;=&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;&quot;{Binding Age}&quot;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;等同于：&lt;/P&gt;&lt;PRE&gt;&lt;FONT style=&quot;FONT-SIZE: 9pt&quot;&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: rgb(128,0,0)&quot;&gt;TextBlock&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(255,0,0)&quot;&gt;Text&lt;/SPAN&gt;=&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;&quot;{Binding Path=Age}&quot;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;或者显式写出绑定方向：&lt;/P&gt;&lt;PRE&gt;&lt;FONT style=&quot;FONT-SIZE: 9pt&quot;&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: rgb(128,0,0)&quot;&gt;TextBlock&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(255,0,0)&quot;&gt;Text&lt;/SPAN&gt;=&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;&quot;{Binding Path=Age, Mode=OneWay}&quot;&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;按照数据绑定的语义，默认是 OneWay 的，也就是说如果后台的数据发生变化，前台建立了绑定关系的相关控件也应该发生更新。&lt;/P&gt;
&lt;P&gt;比如我们可以将文章 (1) 中提到的数据源改为当前页面的一个私有成员，然后在某个 Button 点击事件中更改其中的值。代码如下：&lt;/P&gt;&lt;PRE&gt;&lt;FONT style=&quot;FONT-SIZE: 9pt&quot; face=Verdana&gt;	&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;public&lt;/SPAN&gt; partial &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;class&lt;/SPAN&gt; Page : UserControl
	{
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;private&lt;/SPAN&gt; List&amp;lt;Person&amp;gt; persons;
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;public&lt;/SPAN&gt; Page()
		{
			InitializeComponent();

			persons = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;new&lt;/SPAN&gt; List&amp;lt;Person&amp;gt;();
			&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;for&lt;/SPAN&gt;(var i=0; i&amp;lt; 5; i++)
			{
				persons.Add(&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;new&lt;/SPAN&gt; Person {Name = &quot;&lt;SPAN style=&quot;COLOR: rgb(139,0,0)&quot;&gt;Person &lt;/SPAN&gt;&quot; + i.ToString(), Age = 20 + i});
			}
			list1.DataContext = persons;
		}

		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;private&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;void&lt;/SPAN&gt; Button_Click(&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;object&lt;/SPAN&gt; sender, RoutedEventArgs e)
		{
			persons[0].Name = &quot;&lt;SPAN style=&quot;COLOR: rgb(139,0,0)&quot;&gt;Tom&lt;/SPAN&gt;&quot;;
		}
	}&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;但是我们点击 Button 发现 ListBox 里的数据并没有发生变化。这是因为在数据源更新时，并没有发出任何通知。&lt;/P&gt;
&lt;P&gt;我们可以让数据源中的对象实现 INotifyPropertyChanged 接口，在绑定的源属性值发生变化时，发出相关的通知信息。&lt;/P&gt;
&lt;P&gt;代码如下：&lt;/P&gt;&lt;PRE&gt;&lt;FONT style=&quot;FONT-SIZE: 9pt&quot; face=Verdana&gt;	&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;class&lt;/SPAN&gt; Person: INotifyPropertyChanged
	{
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;private&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;int&lt;/SPAN&gt; age;
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;int&lt;/SPAN&gt; Age
		{
			&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;get&lt;/SPAN&gt;
			{
				&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;return&lt;/SPAN&gt; age;
			}
			&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;set&lt;/SPAN&gt;
			{
				age = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;value&lt;/SPAN&gt;;
				NotifyPropertyChange(&quot;&lt;SPAN style=&quot;COLOR: rgb(139,0,0)&quot;&gt;Age&lt;/SPAN&gt;&quot;);
			}
		}

		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;private&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;string&lt;/SPAN&gt; name;
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;string&lt;/SPAN&gt; Name 
		{
			&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;get&lt;/SPAN&gt;
			{
				&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;return&lt;/SPAN&gt; name;
			}
			&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;set&lt;/SPAN&gt;
			{
				name = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;value&lt;/SPAN&gt;;
				NotifyPropertyChange(&quot;&lt;SPAN style=&quot;COLOR: rgb(139,0,0)&quot;&gt;Name&lt;/SPAN&gt;&quot;);
			}
		}
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;public&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;event&lt;/SPAN&gt; PropertyChangedEventHandler PropertyChanged;

		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;private&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;void&lt;/SPAN&gt; NotifyPropertyChange(&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;string&lt;/SPAN&gt; propertyName)
		{
			&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;if&lt;/SPAN&gt;(PropertyChanged != &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;)
			{
				PropertyChanged(&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;, &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;new&lt;/SPAN&gt; PropertyChangedEventArgs(propertyName));
			}
		}
	}&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;这个代码的原理很简单，这里就不解释了。这样以后，点击按钮，前台的 ListBox 中第一条数据的人名就变成了 Tom:&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;/images/cnblogs_com/RChen/WindowsLiveWriter/Silverlight2_E9A7/listbox3_2.jpg&quot;&gt;&lt;IMG style=&quot;BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px&quot; height=88 alt=listbox3 src=&quot;http://www.cnblogs.com/images/cnblogs_com/RChen/WindowsLiveWriter/Silverlight2_E9A7/listbox3_thumb.jpg&quot; width=244 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;俗话说，要知其然，知其所以然。上面的代码说明了在数据源对象中可以设计一个事件通知属性值的变化，并在适当的时候触发之。但是我们并不知道有谁监听了这个事件，并且把这个通知传达到绑定目标对象 (binding target)，也就是 UI.&lt;/P&gt;
&lt;P&gt;我们用 Reflector 看看 Silverlight 2 beta 2 的源代码，会发现下列两个关键的类：&lt;/P&gt;&lt;PRE&gt;&lt;FONT style=&quot;FONT-SIZE: 9pt&quot;&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;internal&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;class&lt;/SPAN&gt; BindingExpression : BindingExpressionBase
{
	&lt;SPAN style=&quot;COLOR: rgb(0,128,0)&quot;&gt;// ...&lt;/SPAN&gt;

	&lt;SPAN style=&quot;COLOR: rgb(0,128,0)&quot;&gt;// 连接到数据源&lt;/SPAN&gt;
	&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;private&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;void&lt;/SPAN&gt; ConnectToSource(&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;int&lt;/SPAN&gt; index)
	{
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._binding._isSealed = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;true&lt;/SPAN&gt;;
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;if&lt;/SPAN&gt; (&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._binding.Path.PathParts == &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;)
		{
			&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._cachedValue = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._source;
		}
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;else&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;if&lt;/SPAN&gt; ((&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourceListeners == &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;) || (index != &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourceListeners.Length))
		{
			&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;bool&lt;/SPAN&gt; flag = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;false&lt;/SPAN&gt;;
			&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;try&lt;/SPAN&gt;
			{
				&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;object&lt;/SPAN&gt; source;
				&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;if&lt;/SPAN&gt; ((&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourceListeners == &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;) &amp;amp;&amp;amp; (&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._binding.Mode != BindingMode.OneTime))
				{
					&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourceListeners = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;new&lt;/SPAN&gt; WeakPropertyChangedListener[&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._binding.Path.PathParts.Length];
				}
				&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;if&lt;/SPAN&gt; (index == 0)
				{
					source = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._source;
				}
				&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;else&lt;/SPAN&gt;
				{
					source = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourceListeners[--index].Source;
				}
				&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;for&lt;/SPAN&gt; (&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;int&lt;/SPAN&gt; i = index; i &amp;lt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._binding.Path.PathParts.Length; i++)
				{
					&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;if&lt;/SPAN&gt; (source == &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;)
					{
						flag = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;true&lt;/SPAN&gt;;
						&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;return&lt;/SPAN&gt;;
					}
					&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;if&lt;/SPAN&gt; ((&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._binding.Mode != BindingMode.OneTime) &amp;amp;&amp;amp; (&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourceListeners[i] == &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;))
					{
						&lt;SPAN style=&quot;COLOR: rgb(0,128,0)&quot;&gt;// 这里尝试创建源对象的属性变更监听器 (A)&lt;/SPAN&gt;
						&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourceListeners[i] = WeakPropertyChangedListener.CreateIfNecessary(source, &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;);
					}
					&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourcePropertyInfo = source.GetType().GetProperty(&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._binding.Path.PathParts[i]);
					&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._leafSourceObject = source;
					&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;if&lt;/SPAN&gt; (&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourcePropertyInfo == &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;)
					{
						TraceBindingError(&quot;&lt;SPAN style=&quot;COLOR: rgb(139,0,0)&quot;&gt;The path '&lt;/SPAN&gt;&quot; + &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._binding._path.Path + &quot;&lt;SPAN style=&quot;COLOR: rgb(139,0,0)&quot;&gt;' is invalid&lt;/SPAN&gt;&quot;);
						&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._leafSourceObject = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;;
						flag = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;true&lt;/SPAN&gt;;
						&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;return&lt;/SPAN&gt;;
					}
					&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;try&lt;/SPAN&gt;
					{
						source = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourcePropertyInfo.GetValue(source, &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;);
					}
					&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;catch&lt;/SPAN&gt; (TargetInvocationException)
					{
						TraceBindingError(&quot;&lt;SPAN style=&quot;COLOR: rgb(139,0,0)&quot;&gt;Could not connect to '&lt;/SPAN&gt;&quot; + &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._binding._path.Path + &quot;&lt;SPAN style=&quot;COLOR: rgb(139,0,0)&quot;&gt;'&lt;/SPAN&gt;&quot;);
						&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._leafSourceObject = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;;
						&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;return&lt;/SPAN&gt;;
					}
				}
				&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;if&lt;/SPAN&gt; ((&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._binding.Mode == BindingMode.OneTime) || (&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourceListeners[&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourceListeners.Length - 1] == &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;))
				{
					&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._cachedValue = source;
				}
				flag = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;true&lt;/SPAN&gt;;
			}
			&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;finally&lt;/SPAN&gt;
			{
				&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;if&lt;/SPAN&gt; (!flag)
				{
					&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;.DisconnectFromSource(index);
					&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._sourcePropertyInfo = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;;
					&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._leafSourceObject = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;;
				}
			}
		}
	}
}


&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;internal&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;class&lt;/SPAN&gt; WeakPropertyChangedListener
{
	&lt;SPAN style=&quot;COLOR: rgb(0,128,0)&quot;&gt;// ...&lt;/SPAN&gt;

	&lt;SPAN style=&quot;COLOR: rgb(0,128,0)&quot;&gt;// 被 (A) 处代码调用 (B)&lt;/SPAN&gt;
	&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;internal&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;static&lt;/SPAN&gt; WeakPropertyChangedListener CreateIfNecessary(&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;object&lt;/SPAN&gt; source, BindingExpression bindingExpression)
	{
		&lt;SPAN style=&quot;COLOR: rgb(0,128,0)&quot;&gt;// 查看数据源是否实现了 INotifyPropertyChanged 接口&lt;/SPAN&gt;
		INotifyPropertyChanged notify = source &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;as&lt;/SPAN&gt; INotifyPropertyChanged;
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;if&lt;/SPAN&gt; (notify != &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;)
		{
			&lt;SPAN style=&quot;COLOR: rgb(0,128,0)&quot;&gt;// 如果有，创建一个监听器，调用 (C)&lt;/SPAN&gt;
			&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;return&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;new&lt;/SPAN&gt; WeakPropertyChangedListener(notify, bindingExpression);
		}
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;return&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;;
	}

	&lt;SPAN style=&quot;COLOR: rgb(0,128,0)&quot;&gt;// 构造函数 (C)&lt;/SPAN&gt;
	 &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;private&lt;/SPAN&gt; WeakPropertyChangedListener(INotifyPropertyChanged notify, BindingExpression bindingExpression)
	{
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._notifyPropertyChanged = notify;
		&lt;SPAN style=&quot;COLOR: rgb(0,128,0)&quot;&gt;// 这里注册事件的回调函数，以便在属性变化时获得通知（调用 D）&lt;/SPAN&gt;
		notify.PropertyChanged += &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;new&lt;/SPAN&gt; PropertyChangedEventHandler(&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;.PropertyChangedCallback);
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._weakBindingExpression = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;new&lt;/SPAN&gt; WeakReference(bindingExpression);
	}

	&lt;SPAN style=&quot;COLOR: rgb(0,128,0)&quot;&gt;// 回调函数 (D)&lt;/SPAN&gt;
	&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;private&lt;/SPAN&gt; &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;void&lt;/SPAN&gt; PropertyChangedCallback(&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;object&lt;/SPAN&gt; sender, PropertyChangedEventArgs args)
	{
		BindingExpression target = &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;._weakBindingExpression.Target &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;as&lt;/SPAN&gt; BindingExpression;
		&lt;SPAN style=&quot;COLOR: rgb(0,128,0)&quot;&gt;// 这里触发绑定目标对象的更新 (E)&lt;/SPAN&gt;
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;if&lt;/SPAN&gt; (target != &lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;null&lt;/SPAN&gt;)
		{
			target.SourcePropertyChanged(sender, args);
		}
		&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;else&lt;/SPAN&gt;
		{
			&lt;SPAN style=&quot;COLOR: rgb(0,0,255)&quot;&gt;this&lt;/SPAN&gt;.Disconnect();
		}
	}

}&lt;/FONT&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;由上述代码跟踪可以看到整个调用流程(A -&amp;gt; B -&amp;gt; C -&amp;gt; D)：&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;BindingExpression.ConnectToSource()&lt;/P&gt;
&lt;P&gt;-&amp;gt; WeakPropertyChangedListener.ctor()&lt;/P&gt;
&lt;P&gt;-&amp;gt; WeakPropertyChangedListener.PropertyChangedCallback()&lt;/P&gt;
&lt;P&gt;-&amp;gt; BindingExpression.SourcePropertyChanged()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;在 BindingExpression 中连接数据源时，就判断其是否实现了 INotifyPropertyChanged 接口，如果实现了，则注册一个回调函数。&lt;/P&gt;
&lt;P&gt;在数据源发生变化时，将触发这个回调函数，在这个函数中调用到 BindingExpression 的 SourcePropertyChanged() 函数去更新目标对象。&lt;/P&gt;
&lt;P&gt;这样就实现了一个 source -&amp;gt; target 绑定的数据更新触发机制。&lt;/P&gt;&lt;img src =&quot;http://RChen.cnblogs.com/aggbug/1235816.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37517/&quot; target=&quot;_blank&quot;&gt;[新闻]雅虎:一颗棋子的起落&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 16:58:00 +0800</pubDate><author>木野狐(Neil Chen)</author><comments>http://www.cnblogs.com/RChen/archive/2008/07/04/1235816.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/RChen/archive/2008/07/04/1235816.html</guid><dc:creator>木野狐(Neil Chen)</dc:creator><fs:srclink>http://www.cnblogs.com/RChen/archive/2008/07/04/1235816.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90026053/4050094</fs:itemid></item><item><title>服务器控件开发 - 事件机制（3）</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90016828/4050094/1/item.html</link><wfw:comment>http://wwwyfjp.cnblogs.com/comments/1235784.html</wfw:comment><slash:comments>6</slash:comments><wfw:commentRss>http://wwwyfjp.cnblogs.com/comments/commentRss/1235784.html</wfw:commentRss><trackback:ping>http://wwwyfjp.cnblogs.com/services/trackbacks/1235784.html</trackback:ping><description>&lt;font face=&quot;Verdana&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在&lt;a href=&quot;http://www.cnblogs.com/wwwyfjp/archive/2008/06/26/1230154.html&quot;&gt;上一篇&lt;/a&gt;的基础上， 我们来看看如何为我们的服务器控件添加事件支持。&amp;nbsp;丰富的事件支持能让控件的使用者最大限度的参与控件的生命周期，最大限度得提高控件的重用性。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;每一个服务器控件都从Control基类继承了 OnInit, OnLoad, OnPreRender, and OnUnLoad 等 4 个事件. 在页面开发中, 开发人员可以通过2种方式来注册ASP.NET事件. &lt;br /&gt;
1. 通过声明的方式&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Button id=&quot;button1&quot; OnClick=&quot;button1_Click&quot; Text=&quot;Submit&quot; runat=&quot;server&quot; /&amp;gt;&lt;br /&gt;
2. 通过编程的方式&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; button1.Click += new EventHandler(this.button1_Click);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;另外一点需要注意的是, 在Asp.net 2.0 里面. 页面模型自动将Page_Init, Page_Load, Page_PreRender, and Page_Unload 4 个方法绑定到页面对应的事件.&lt;br /&gt;
而不需要显式的声明. 这个特性是通过在页面声明中加入 AutoEventWireup=&quot;true&quot; 来实现的. 如果发现页面不触发Page_Load 事件. 一个可能的原因就是&lt;br /&gt;
AutoEventWireup 的值被设为 False.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 在C# 中 定义一个典型的事件代码如下：&lt;br /&gt;
&lt;div class=&quot;cnblogs_code&quot;&gt;&lt;img id=&quot;Code_Closed_Image_155911&quot; onclick=&quot;this.style.display='none'; Code_Closed_Text_155911.style.display='none'; Code_Open_Image_155911.style.display='inline'; Code_Open_Text_155911.style.display='inline';&quot; height=&quot;16&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; width=&quot;11&quot; align=&quot;top&quot; /&gt;&lt;img id=&quot;Code_Open_Image_155911&quot; style=&quot;display: none&quot; onclick=&quot;this.style.display='none'; Code_Open_Text_155911.style.display='none'; Code_Closed_Image_155911.style.display='inline'; Code_Closed_Text_155911.style.display='inline';&quot; height=&quot;16&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; width=&quot;11&quot; align=&quot;top&quot; /&gt;&lt;span id=&quot;Code_Closed_Text_155911&quot; style=&quot;border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff&quot;&gt;Code&lt;/span&gt;&lt;span id=&quot;Code_Open_Text_155911&quot; style=&quot;display: none&quot;&gt;&lt;br /&gt;
&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;delegate&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;ClickEventHanlder(&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;object&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e);&lt;br /&gt;
&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;ClickEventHanlder&amp;nbsp;OnClickEvent&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;;&lt;br /&gt;
&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;RaiseEvent()&lt;br /&gt;
&lt;img id=&quot;Codehighlighter1_162_272_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_162_272_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_162_272_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_162_272_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; align=&quot;top&quot; /&gt;&lt;img id=&quot;Codehighlighter1_162_272_Closed_Image&quot; style=&quot;display: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_162_272_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_162_272_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_162_272_Open_Text').style.display='inline';&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;Codehighlighter1_162_272_Closed_Text&quot; style=&quot;border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; /&gt;&lt;/span&gt;&lt;span id=&quot;Codehighlighter1_162_272_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000&quot;&gt;{&lt;br /&gt;
&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;(OnClickEvent&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;)&lt;br /&gt;
&lt;img id=&quot;Codehighlighter1_206_266_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_206_266_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_206_266_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_206_266_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif&quot; align=&quot;top&quot; /&gt;&lt;img id=&quot;Codehighlighter1_206_266_Closed_Image&quot; style=&quot;display: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_206_266_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_206_266_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_206_266_Open_Text').style.display='inline';&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;Codehighlighter1_206_266_Closed_Text&quot; style=&quot;border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; /&gt;&lt;/span&gt;&lt;span id=&quot;Codehighlighter1_206_266_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000&quot;&gt;{&lt;br /&gt;
&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OnClickEvent(&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;,&amp;nbsp;EventArgs.Empty);&lt;br /&gt;
&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;font face=&quot;Verdana&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;然而, 在ASP.NET 中, 微软并没有采用这样一种方式来定义事件.而是基于Web 开发的特点进行优化, 采用了另外一种方式. 书中提到了2 点之所以不采用&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 经典事件实现模式的原因:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.&amp;nbsp; 不管事件是否被注册到具体的方法, 每当我们定义一个事件成员, 比如说&amp;nbsp;&amp;nbsp;&amp;nbsp; public event ClickEventHanlder OnClickEvent = null;&amp;nbsp; 编译器都会为&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 之生成一个私有的代理,比如: delegate void ClickEventHanlder(object sender, EventArgs e). 一但事件数目比较多, 将会浪费很多宝贵的内存空间&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.&amp;nbsp; 编译器会为经典事件模式生成一大堆的线程同步的代码. 这样不但降低了执行效率而且是毫无必要的, 因为页面开发者很少在单个页面使用多线程.&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
现在让我们来看一下针对于Asp.net 的优化的 基于System.ComponentModel.EventHandlerList 类的事件实现模式,&amp;nbsp; &lt;br /&gt;
首先来看看Control 中 OnInit 事件的实现.&lt;br /&gt;
&amp;nbsp;1. 声明一个 EventHandlerList&amp;nbsp; 类型的事件索引，用来保存代理列表。
&lt;div class=&quot;cnblogs_code&quot;&gt;&lt;img id=&quot;Code_Closed_Image_160129&quot; onclick=&quot;this.style.display='none'; Code_Closed_Text_160129.style.display='none'; Code_Open_Image_160129.style.display='inline'; Code_Open_Text_160129.style.display='inline';&quot; height=&quot;16&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; width=&quot;11&quot; align=&quot;top&quot; /&gt;&lt;img id=&quot;Code_Open_Image_160129&quot; style=&quot;display: none&quot; onclick=&quot;this.style.display='none'; Code_Open_Text_160129.style.display='none'; Code_Closed_Image_160129.style.display='inline'; Code_Closed_Text_160129.style.display='inline';&quot; height=&quot;16&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; width=&quot;11&quot; align=&quot;top&quot; /&gt;&lt;span id=&quot;Code_Closed_Text_160129&quot; style=&quot;border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff&quot;&gt;Code&lt;/span&gt;&lt;span id=&quot;Code_Open_Text_160129&quot; style=&quot;display: none&quot;&gt;&lt;br /&gt;
&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;EventHandlerList&amp;nbsp;_events;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;protected&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;EventHandlerList&amp;nbsp;Events&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;(_events&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_events&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;EventHandlerList();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;_events;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font face=&quot;Verdana&quot;&gt;&amp;nbsp;Control 基类为每一个事件定义了一个静态只读的键, 用来从EventHandlerList 中获取事件代理, 或者将事件代理添加到事件列表上.&lt;/font&gt;&lt;br /&gt;
&lt;div class=&quot;cnblogs_code&quot;&gt;&lt;img id=&quot;Code_Closed_Image_160229&quot; onclick=&quot;this.style.display='none'; Code_Closed_Text_160229.style.display='none'; Code_Open_Image_160229.style.display='inline'; Code_Open_Text_160229.style.display='inline';&quot; height=&quot;16&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; width=&quot;11&quot; align=&quot;top&quot; /&gt;&lt;img id=&quot;Code_Open_Image_160229&quot; style=&quot;display: none&quot; onclick=&quot;this.style.display='none'; Code_Open_Text_160229.style.display='none'; Code_Closed_Image_160229.style.display='inline'; Code_Closed_Text_160229.style.display='inline';&quot; height=&quot;16&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; width=&quot;11&quot; align=&quot;top&quot; /&gt;&lt;span id=&quot;Code_Closed_Text_160229&quot; style=&quot;border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff&quot;&gt;Code&lt;/span&gt;&lt;span id=&quot;Code_Open_Text_160229&quot; style=&quot;display: none&quot;&gt;&lt;br /&gt;
&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;protected&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;readonly&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;object&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;EventInit&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;object&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;font face=&quot;Verdana&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注意这个键是静态共享的, 这意味着所有的控件的所有实例共享这个键.&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font face=&quot;Verdana&quot;&gt;&amp;nbsp;2. Control 基类使用一个事件属性来定义事件. 而不是使用事件成员.&lt;/font&gt;
&lt;div class=&quot;cnblogs_code&quot;&gt;&lt;img id=&quot;Code_Closed_Image_160328&quot; onclick=&quot;this.style.display='none'; Code_Closed_Text_160328.style.display='none'; Code_Open_Image_160328.style.display='inline'; Code_Open_Text_160328.style.display='inline';&quot; height=&quot;16&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; width=&quot;11&quot; align=&quot;top&quot; /&gt;&lt;img id=&quot;Code_Open_Image_160328&quot; style=&quot;display: none&quot; onclick=&quot;this.style.display='none'; Code_Open_Text_160328.style.display='none'; Code_Closed_Image_160328.style.display='inline'; Code_Closed_Text_160328.style.display='inline';&quot; height=&quot;16&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; width=&quot;11&quot; align=&quot;top&quot; /&gt;&lt;span id=&quot;Code_Closed_Text_160328&quot; style=&quot;border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff&quot;&gt;Code&lt;/span&gt;&lt;span id=&quot;Code_Open_Text_160328&quot; style=&quot;display: none&quot;&gt;&lt;br /&gt;
&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;EventHandler&amp;nbsp;Init&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Events.AddHandler(EventInit,&amp;nbsp;value);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;remove&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Events.RemoveHandler(EventInit,&amp;nbsp;value);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当用户向事件列表添加一个事件代理， Events 类首先通过事件的键 判断 事件是否已经添加。 如果未添加， 则添加，如果键已经存在， 则将代理方法添加到键所对应的代理的代理列表上。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;当用户再事件列表移除一个事件代理， 过程刚好相反。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face=&quot;Verdana&quot;&gt;&amp;nbsp;&amp;nbsp;3. 定义一个事件触发器， 通过一个hook, 调用代理方法。&lt;/p&gt;
&lt;div class=&quot;cnblogs_code&quot;&gt;&lt;img id=&quot;Code_Closed_Image_160527&quot; onclick=&quot;this.style.display='none'; Code_Closed_Text_160527.style.display='none'; Code_Open_Image_160527.style.display='inline'; Code_Open_Text_160527.style.display='inline';&quot; height=&quot;16&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; width=&quot;11&quot; align=&quot;top&quot; /&gt;&lt;img id=&quot;Code_Open_Image_160527&quot; style=&quot;display: none&quot; onclick=&quot;this.style.display='none'; Code_Open_Text_160527.style.display='none'; Code_Closed_Image_160527.style.display='inline'; Code_Closed_Text_160527.style.display='inline';&quot; height=&quot;16&quot; alt=&quot;&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; width=&quot;11&quot; align=&quot;top&quot; /&gt;&lt;span id=&quot;Code_Closed_Text_160527&quot; style=&quot;border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff&quot;&gt;Code&lt;/span&gt;&lt;span id=&quot;Code_Open_Text_160527&quot; style=&quot;display: none&quot;&gt;&lt;br /&gt;
&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;protected&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;virtual&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;OnInit(EventArgs&amp;nbsp;e)&amp;nbsp;{&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EventHandler&amp;nbsp;initHandler&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;(EventHandler)Events[EventInit];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;(initHandler&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initHandler(&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;,&amp;nbsp;e);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/font&gt;&lt;font face=&quot;Verdana&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&amp;nbsp;最后&amp;nbsp; 在页面的特定阶段触发事件， OnInit 事件的触发可以参考我第一篇当中的 InitRecursive方法&lt;/p&gt;
&lt;p&gt;通过以上方式就可以任意的为我们的自定义控件添加事件。 而不需要去考虑任何的性能问题。&lt;/p&gt;
&lt;p&gt;下一篇&amp;nbsp; ： 服务器控件的 PostBack 机制。&lt;/font&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;img src =&quot;http://wwwyfjp.cnblogs.com/aggbug/1235784.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37516/&quot; target=&quot;_blank&quot;&gt;[新闻]Firefox联合搜狐推出奥运浏览器&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 16:27:00 +0800</pubDate><author>welkin</author><comments>http://www.cnblogs.com/wwwyfjp/archive/2008/07/04/1235784.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/wwwyfjp/archive/2008/07/04/1235784.html</guid><dc:creator>welkin</dc:creator><fs:srclink>http://www.cnblogs.com/wwwyfjp/archive/2008/07/04/1235784.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90016828/4050094</fs:itemid></item><item><title>IE7的web标准之道——9：（修正）疯了的边框线</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90000148/4050094/1/item.html</link><wfw:comment>http://JustinYoung.cnblogs.com/comments/1235707.html</wfw:comment><slash:comments>22</slash:comments><wfw:commentRss>http://JustinYoung.cnblogs.com/comments/commentRss/1235707.html</wfw:commentRss><trackback:ping>http://JustinYoung.cnblogs.com/services/trackbacks/1235707.html</trackback:ping><description>摘要: &lt;div style=&quot;float:right;text-align:center;font-size:9pt;color:teal;border:1px dotted teal;width:115px&quot;&gt;&lt;img src=&quot;/images/cnblogs_com/justinyoung/2008_1q/ie7road.png&quot; /&gt;&lt;br/&gt;IE7的web标准之道&lt;/div&gt;
&lt;br&gt;&lt;p&gt;IE历来被web标准的拥护者所诟病，而当FireFox横空出世以后，更多的网页制作者开始关注web标准设计。看着FireFox的市场占有率不停的上升，微软终于推出了IE7。但IE7是否真的能够力挽狂澜，是否真的能够得到用户的信任，是否真的能够得到网页设计者的认可呢？&lt;/p&gt;&lt;p&gt;且看《IE7的web标准之道》系列文章，和你一起见证IE7的改变！&lt;/p&gt;&amp;nbsp;&amp;nbsp;&lt;a href='http://www.cnblogs.com/JustinYoung/archive/2008/07/04/border-chaos.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://JustinYoung.cnblogs.com/aggbug/1235707.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37515/&quot; target=&quot;_blank&quot;&gt;[新闻]Google音乐搜索即将上线&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 15:35:00 +0800</pubDate><author>杨正祎(阿一)</author><comments>http://www.cnblogs.com/JustinYoung/archive/2008/07/04/border-chaos.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/JustinYoung/archive/2008/07/04/border-chaos.html</guid><dc:creator>杨正祎(阿一)</dc:creator><fs:srclink>http://www.cnblogs.com/JustinYoung/archive/2008/07/04/border-chaos.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90000148/4050094</fs:itemid></item><item><title>OOAD和SOA的一些个人体会</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90000181/4050094/1/item.html</link><wfw:comment>http://dfchengcn.cnblogs.com/comments/1235702.html</wfw:comment><slash:comments>2</slash:comments><wfw:commentRss>http://dfchengcn.cnblogs.com/comments/commentRss/1235702.html</wfw:commentRss><trackback:ping>http://dfchengcn.cnblogs.com/services/trackbacks/1235702.html</trackback:ping><description>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SOA作为整合历史的系统，和现有的各个分立的系统有先天的优势，但SOA作为一个革命性的新软件开发方法论的面目出现，更深层次的原因在于它对于复杂性的处理方式有别于以前的方法论。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们可以简单的将开发的复杂性归结为对各个领域对象的状态的控制上，意思就是如果在任何时刻系统的领域对象的所有状态是明确可知的，那么就可以说这个系统是可控的。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可以推断出随着业务领域的复杂程度提高，领域对象会不断增长，这个问题还不是很大，线性增长，毕竟还是可控的，但是考察整个业务领域的状态来看，其复杂度是和领域对象个数成指数增加的。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在简单的业务范围，领域对象少，那么用结构化的方式也可以应付的，通过自顶向下的方式，将系统分解为模块和函数来控制系统。这个方法的弊端我想大家都很清楚了，就不赘述了。到底领域对象增长到多少这种方法就无法应付呢。这个没有具体统计，只是看到用这个方法论来指导的开发在实践中不断的失败。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这时候OOAD的方法论出来了，通过封装，继承，和多态的手段，各种设计模式如雨后春笋一样，可管理的领域对象数量得以大大增加，成功的案例不断增多，但是通过统计，我们还是不断的听到有一些大型的项目的投资失败了。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 原因是什么呢，关键是对这个复杂性的处理，目前有两种手段，一个是加强对复杂性的管理水平，尽量穷尽各种手段来分解并管理复杂性。一种方法是减少复杂性。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OOAD方式是前一种，而SOA则是后一种。也许大家很奇怪，业务领域本来就是这么复杂，怎么减少他的复杂性呢？答案是分区，当你将业务领域分开为多个完全独立的区域的时候，复杂性就不是指数增加，而是变成线性增加的方式了，SOA通过提供软件自治概念，松耦合，无状态的Web服务，将各个部分变成完全独立的地址透明的服务，原来看来非常复杂的业务领域就突然变的不那么复杂了。至少复杂度不再指数增加了。&lt;br /&gt;
&lt;br /&gt;
也许大家可能说什么自治，松耦合，无状态这些概念在OOAD里面也有啊，我也会将系统水平和垂直划分为很多个子系统和层啊，这个我相信，好的架构师会做到的，但是就整体来看，子系统并没有脱离系统，和系统在逻辑上和硬件上的耦合还是很多。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;说了这么多，大家都是对OOAD是不是很失落呢，毕竟大家都是从OOAD走过来的，是不是要放弃OO思想呢，这个我想不是的，在一个相对可控的领域，用OOAD的方式可以很好工作，范围大了后，可以考虑在这个系统上提供出Web服务来也是可以的。当然想完整实现SOA的话，必须用整套方法论，以前结构化编程的自顶向下的思想又重新回来了，所以说没有什么是绝对的，要考虑上下文环境。&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 时间仓促，写的很粗糙。 欢迎大家和我交流 dfchengcn@yahoo.com.cn.
&lt;img src =&quot;http://dfchengcn.cnblogs.com/aggbug/1235702.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37514/&quot; target=&quot;_blank&quot;&gt;[新闻]哪一个 Linux 发行版最流行?&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 15:32:00 +0800</pubDate><author>在现实和理想之间行走</author><comments>http://www.cnblogs.com/dfchengcn/archive/2008/07/04/1235702.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/dfchengcn/archive/2008/07/04/1235702.html</guid><dc:creator>在现实和理想之间行走</dc:creator><fs:srclink>http://www.cnblogs.com/dfchengcn/archive/2008/07/04/1235702.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90000181/4050094</fs:itemid></item><item><title>《聊聊云计算》，评论和讨论</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/90003676/4050094/1/item.html</link><wfw:comment>http://renmin.cnblogs.com/comments/1235701.html</wfw:comment><slash:comments>9</slash:comments><wfw:commentRss>http://renmin.cnblogs.com/comments/commentRss/1235701.html</wfw:commentRss><trackback:ping>http://renmin.cnblogs.com/services/trackbacks/1235701.html</trackback:ping><description>摘要: &amp;nbsp;&amp;nbsp;&lt;a href='http://www.cnblogs.com/renmin/archive/2008/07/04/1235701.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://renmin.cnblogs.com/aggbug/1235701.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37513/&quot; target=&quot;_blank&quot;&gt;[新闻]方兴东证实博客网因业务调整裁员&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 15:32:00 +0800</pubDate><author>旻</author><comments>http://www.cnblogs.com/renmin/archive/2008/07/04/1235701.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/renmin/archive/2008/07/04/1235701.html</guid><dc:creator>旻</dc:creator><fs:srclink>http://www.cnblogs.com/renmin/archive/2008/07/04/1235701.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/90003676/4050094</fs:itemid></item><item><title>Apache2.2下运行asp.net2.0(win32)</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/89994191/4050094/1/item.html</link><wfw:comment>http://xin478.cnblogs.com/comments/1235676.html</wfw:comment><slash:comments>13</slash:comments><wfw:commentRss>http://xin478.cnblogs.com/comments/commentRss/1235676.html</wfw:commentRss><trackback:ping>http://xin478.cnblogs.com/services/trackbacks/1235676.html</trackback:ping><description>&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/images/cnblogs_com/xin478/123121.gif&quot; width=&quot;770&quot; height=&quot;860&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
得益于mod_aspdotnet.so，这个支持apache2.2的不好找，附上&lt;a href=&quot;http://www.cnblogs.com/Files/xin478/mod_aspdotnet-2.2.0.2006-setup-r2.rar&quot;&gt;http://www.cnblogs.com/Files/xin478/mod_aspdotnet-2.2.0.2006-setup-r2.rar&lt;/a&gt;&lt;br /&gt;
有个支持apache2.0的，到处上，可以上网找。&lt;br /&gt;
安装后，打开httpd.conf,尾部添加&lt;br /&gt;
LoadModule aspdotnet_module &quot;modules/mod_aspdotnet.so&quot;&lt;br /&gt;
&lt;br /&gt;
AddHandler asp.net asax ascx ashx asmx aspx axd config cs csproj licx rem resources resx soap vb vbproj vsdisco webinfo &lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_aspdotnet.cpp&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Mount the ASP.NET example application&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AspNetMount &lt;span style=&quot;color: rgb(0, 16, 255);&quot;&gt;/wwwroot&lt;/span&gt; &quot;&lt;span style=&quot;color: red;&quot;&gt;f:/wwwroot&lt;/span&gt;&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Map all requests for /active to the application files&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Alias &lt;span style=&quot;color: rgb(0, 16, 255);&quot;&gt;/wwwroot&lt;/span&gt; &quot;&lt;span style=&quot;color: red;&quot;&gt;f:/wwwroot&lt;/span&gt;&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; # Allow asp.net scripts to be executed in the active example&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Directory &quot;&lt;span style=&quot;color: red;&quot;&gt;f:/wwwroot&lt;/span&gt;&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Options FollowSymlinks ExecCGI&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Order allow,deny&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Allow from all&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DirectoryIndex index.aspx&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; # For all virtual ASP.NET webs, we need the aspnet_client files&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; # to serve the client-side helper scripts.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AliasMatch /aspnet_client/system_web/(\d+)_(\d+)_(\d+)_(\d+)/(.*) \&quot;C:/Windows/Microsoft.NET/Framework/v$1.$2.$3/ASP.NETClientFiles/$4&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Directory &quot;C:/Windows/Microsoft.NET/Framework/v*/ASP.NETClientFiles&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Options FollowSymlinks&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Order allow,deny&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Allow from all&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，&lt;span style=&quot;color: red;&quot;&gt;f:/wwwroot &lt;/span&gt;是你机子上网站的根目录，&lt;span style=&quot;color: rgb(0, 16, 255);&quot;&gt;/wwwroot&lt;/span&gt;是通过Apache来访问的路径。&lt;br /&gt;
运行下测试，&lt;br /&gt;
在IIS5.1下，&lt;br /&gt;
2000万次整数运算性能&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; 62.5 毫秒&lt;br /&gt;
2000万次浮点运算性能&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; 140.625 毫秒&lt;br /&gt;
&lt;br /&gt;
apache2.2下&lt;br /&gt;
2000万次整数运算性能&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; 62.5 毫秒&lt;br /&gt;
2000万次浮点运算性能&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; 140.625 毫秒&lt;br /&gt;
&lt;br /&gt;
时间一样，据解释是由于IIS和Apache下的ASP.NET都是运行在Common Language Runtime(CLR)的基础上，因此Apache环境下的ASP.NET程序的运行速度不会比在IIS下慢。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img src =&quot;http://xin478.cnblogs.com/aggbug/1235676.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37512/&quot; target=&quot;_blank&quot;&gt;[新闻]Sandcastle项目全部开源&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 15:04:00 +0800</pubDate><author>xin478</author><comments>http://www.cnblogs.com/xin478/archive/2008/07/04/1235676.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/xin478/archive/2008/07/04/1235676.html</guid><dc:creator>xin478</dc:creator><fs:srclink>http://www.cnblogs.com/xin478/archive/2008/07/04/1235676.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/89994191/4050094</fs:itemid></item><item><title>XML和JSON(JavaScript Object Notation)</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/89987602/4050094/1/item.html</link><wfw:comment>http://tedzhao.cnblogs.com/comments/1233625.html</wfw:comment><slash:comments>6</slash:comments><wfw:commentRss>http://tedzhao.cnblogs.com/comments/commentRss/1233625.html</wfw:commentRss><trackback:ping>http://tedzhao.cnblogs.com/services/trackbacks/1233625.html</trackback:ping><description>&lt;span style=&quot;font-weight: bold;&quot;&gt;原创文章，如需转载，请注明出处。&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;当我们在定义AJAX服务的时候，对于各种各样的请求，应该以什么样的数据格式来响应哪？&lt;br /&gt;
当然如果是请求一段Markup代码的话，HTML就是最合适的，客户端请求到数据后，就可以直接插入到前端页面中了。那如果客户端需要的是纯粹的数据的话，我们是应该提供XML哪，还是JSON？这两者各有什么优缺点和好处哪，了解了这两者的差异后我们就可以基于实际情况进行权衡取舍了。&lt;br /&gt;
&lt;br /&gt;
我们从以下几个方面来进行比较：&lt;br /&gt;
&lt;strong&gt;1、客户端&lt;/strong&gt;&lt;br /&gt;
在客户端通过向服务器发送XMLHttpRequest，就可以得到请求数据了，哪什么样的数据格式更容易处理哪？&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
JSON示例：&lt;br /&gt;
&lt;div class=&quot;cnblogs_code&quot;&gt;&lt;!--&lt;br /&gt;
&lt;br /&gt;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;
http://www.CodeHighlighter.com/&lt;br /&gt;
&lt;br /&gt;
--&gt;&lt;img id=&quot;Codehighlighter1_0_115_Open_Image&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_0_115_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_0_115_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_0_115_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;&lt;img id=&quot;Codehighlighter1_0_115_Closed_Image&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_0_115_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_0_115_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_0_115_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;&lt;span id=&quot;Codehighlighter1_0_115_Closed_Text&quot; style=&quot;border: 1px solid #808080; background-color: #ffffff; display: none;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;&lt;/span&gt;&lt;span id=&quot;Codehighlighter1_0_115_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&amp;nbsp;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;author&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;:&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Gambardella,&amp;nbsp;Matthew&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&amp;nbsp;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;XML&amp;nbsp;Developer's&amp;nbsp;Guide&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&amp;nbsp;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;genre&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Computer&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
对于JSON数据，只需要调用JavaScript的Eval方法就可以将JSON字符串序列化成为JavaScript对象，而后就可以直接访问了。如下所示：&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;cnblogs_code&quot;&gt;&lt;!--&lt;br /&gt;
&lt;br /&gt;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;
http://www.CodeHighlighter.com/&lt;br /&gt;
&lt;br /&gt;
--&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;book&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;eval(request.responseText);&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;alert(book.author); &lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
XML示例：&lt;br /&gt;
&lt;div class=&quot;cnblogs_code&quot;&gt;&lt;!--&lt;br /&gt;
&lt;br /&gt;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;
http://www.CodeHighlighter.com/&lt;br /&gt;
&lt;br /&gt;
--&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;book&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;author&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Gambardella,&amp;nbsp;Matthew&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;author&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;XML&amp;nbsp;Developer's&amp;nbsp;Guide&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;genre&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Computer&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;genre&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;book&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
对于XML数据，其本身是一个DOM Tree的数据结构，开发人员必须使用DOM API来访问和处理XML数据；而且DOM在各个浏览器中的实现也不尽相同，所以针对XML DOM的编程方式会变的更为复杂。参见下面的实现方式：&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;cnblogs_code&quot;&gt;&lt;!--&lt;br /&gt;
&lt;br /&gt;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;
http://www.CodeHighlighter.com/&lt;br /&gt;
&lt;br /&gt;
--&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;book&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;request.responseXML;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;authors&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;book.getElementsByTagName(&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;author&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;);&amp;nbsp;&amp;nbsp;&lt;br /&gt;
alert(authors[&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;].firstChild.textContent); &lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
另外对于XMLDOM，浏览器目前还不支持类似于XPath这样的查询语句。显然对于XMLDOM数据的访问显然要比访问JSON复杂多了。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;2、服务器端&lt;br /&gt;
&lt;/strong&gt;在服务器端需要向客户端发送数据，什么样的数据格式处理起来更容易哪？&lt;br /&gt;
&lt;br /&gt;
显然对于如何序列化或者犯序列化一个对象成为XML字符串，各种服务端的编程语言都有提供，而且还会有多种方式。例如.NET Framework就提供了&lt;span id=&quot;nsrTitle&quot;&gt;XmlSerializer类来序列化一个对象成为Xml文档，另外开发人员&lt;/span&gt;还可以使用XmlWriter、XMLDocument来直接构建Xml字符串。&lt;br /&gt;
&lt;br /&gt;
而对于JSON这样一种数据格式则鲜有提供，这就需要开发人员自己动手或者使用一些Open Source的Library。在复杂对象的序列化或者反序列化上，由于Xml做的比较早应该会更稳定一些。&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;
&lt;/strong&gt;在这点上XML会优于JSON.&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;
3、安全性&lt;br /&gt;
&lt;/strong&gt;JSON 本来是JavaScript 的一个安全的子集，不会含有赋值和调用。因此在将JSON数据装换成为JavaScript对象的时候，我们包括许多JavaScript 库都使用 &lt;code&gt;Eval&lt;/code&gt; 函数。这意味着获取的JSON数据将被解析并执行，注意是&lt;strong&gt;执行&lt;/strong&gt;，尤其有一些数据是来自用户输入的话，可能会带来意想不到的安全性问题。攻击者也可以利用这点发送畸形、恶意的 JSON数据，这样&lt;code&gt;Eval&lt;/code&gt; 函数就会执行这些恶意代码。&lt;br /&gt;
&lt;strong&gt;
&lt;br /&gt;
&lt;/strong&gt;从这一点上来说也要求我们如果在使用JSON作为数据交换格式的时候，必须保障JSON安全。比较常见的办法是使用正则表达式来检查JSON数据是否包含有恶意代码关键字。&lt;br /&gt;
&lt;br /&gt;
而XML则相对来讲更安全一些。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;
4、性能&lt;/strong&gt;&lt;br /&gt;
从数据传输量上来看JSON显然要优于XML，JSON更轻量级一些，它没有像XML那样多的Open和Closing标记。同时在对数据的解析速度上，JSON也要优于XML。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;5. 其他&lt;/strong&gt;&lt;br /&gt;
另外从数据格式的验证角度来看的话，XML的验证技术更成熟，而目前关于JSON的验证还比较少。&lt;br /&gt;
&lt;br /&gt;
&lt;font face=&quot;Verdana&quot;&gt;&lt;/font&gt;
&lt;img src =&quot;http://tedzhao.cnblogs.com/aggbug/1233625.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37511/&quot; target=&quot;_blank&quot;&gt;[新闻]“博客园开发者征途系列” 即将发布重磅级新书&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 14:50:00 +0800</pubDate><author>ted</author><comments>http://www.cnblogs.com/tedzhao/archive/2008/07/04/1233625.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/tedzhao/archive/2008/07/04/1233625.html</guid><dc:creator>ted</dc:creator><fs:srclink>http://www.cnblogs.com/tedzhao/archive/2008/07/04/1233625.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/89987602/4050094</fs:itemid></item><item><title>也实现一个首页图片幻灯效果</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/89971259/4050094/1/item.html</link><wfw:comment>http://basilwang.cnblogs.com/comments/1235542.html</wfw:comment><slash:comments>9</slash:comments><wfw:commentRss>http://basilwang.cnblogs.com/comments/commentRss/1235542.html</wfw:commentRss><trackback:ping>http://basilwang.cnblogs.com/services/trackbacks/1235542.html</trackback:ping><description>摘要: &lt;p&gt;&lt;img src=&quot;http://www.cnblogs.com/images/cnblogs_com/basilwang/k1.jpg&quot; align=&quot;right&quot;/&gt;前几天，在园子里看了一个图片幻灯效果，很不错，不过今天想找却找不到了。这两天想把网站的图片幻灯效果给换了，原来的虽然做成了web控件，不过控件里硬编码了javascript和css，甚至还有document.write这样的输出，感觉很是不爽。偶然发现了一篇翻译文章如何使用 JavaScript 创建可维护的幻灯片效果，感觉原作者在构建可分离的javascript和css上颇有心得,不过这里和我想要的效果还有些差异，参照大部分国内网站的实现方式，应该能够实现定时的播放，同时在右下角还应该有一个序列号的指示，就像新浪网的首页那样，既然作者帮我们作了大部分的分离工作，剩下的这部分自己实现，也十分简单。&lt;/p&gt;&amp;nbsp;&amp;nbsp;&lt;a href='http://www.cnblogs.com/basilwang/archive/2008/07/04/1235542.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://basilwang.cnblogs.com/aggbug/1235542.html?type=1&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://news.cnblogs.com/n/37510/&quot; target=&quot;_blank&quot;&gt;[新闻]Google官方推出Google Talk苹果iPhone版&lt;/a&gt;</description><pubDate>Fri, 04 Jul 2008 13:16:00 +0800</pubDate><author>BAsil</author><comments>http://www.cnblogs.com/basilwang/archive/2008/07/04/1235542.html#Feedback</comments><guid isPermaLink="false">http://www.cnblogs.com/basilwang/archive/2008/07/04/1235542.html</guid><dc:creator>BAsil</dc:creator><fs:srclink>http://www.cnblogs.com/basilwang/archive/2008/07/04/1235542.html</fs:srclink><fs:srcfeed>http://www.cnblogs.com/rss.aspx</fs:srcfeed><fs:itemid>feedsky/blogyuan/~1215479/89971259/4050094</fs:itemid></item><item><title>Windows Embedded Standard开发初体验（三）</title><link>http://item.feedsky.com/~feedsky/blogyuan/~1215479/89949678/4050094/1/item.html</link><wfw:comment>http://aawolf.cnblogs.com/comments/1235393.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://aawolf.cnblogs.com/comments/commentRss/1235393.html</wfw:commentRss><trackback:ping>http://aawolf.cnblogs.com/services/trackbacks/1235393.html</trackback:ping><description>&amp;nbsp;
&lt;h2&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Cambria; mso-hansi-font-family: Cambria; mso-fareast-theme-font: major-fareast; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin&quot;&gt;开始创建&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Cambria; mso-hansi-font-family: Cambria; mso-fareast-theme-font: major-fareast; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin&quot;&gt;的组件&lt;/span&gt;&lt;/h2&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;在嵌入式领域发挥的作用绝对不仅仅只有增加&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Web&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;的用户体验而已。很多嵌入式设备需要丰富多彩的用户交互界面，比如&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;ATM&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;、自动售货机、自助查询终端、老虎机（喔）&amp;#8230;&amp;#8230;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Windows Embedded Standard&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;的主要应用领域恰好在这几个方面，所以&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;对于来说&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Windows Embedded Standard&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;来说是如虎添翼。可能有朋友也会说，我们使用其他技术也可以实现与&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;类似的界面，这个肯定是没错。但是考虑到与后台数据库或&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Web Service&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;的交互、部署成本、维护成本等问题，我相信&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;肯定会成为开发者今后开发中的首选。&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;好了，先不说那么多，我们下一步要做的是将&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;变成&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;WES&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;的主界面，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;WES&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;启动之后直接进入到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;的应用之中。我们知道&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Host&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;IE&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;等浏览器中运行的，在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;WES&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;中也是这样，而&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;的部署有两种方式：第一种是将&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;文件部署到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;WES&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Image&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;中，随&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Image&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;一起发布；另一种是让浏览器启动后访问&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Internet&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;上的某个&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;站点。这两种方法有各自的应用场景，我们在这里不做过多分析。在这里，我们挑选比较难得一种：将&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;文件与&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;WES&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Image&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;一起发布。&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;第一步，我们要创建一个组件：这个组件应该是一个&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Shell&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;组件，在系统启动后不进入我们传统意义上的&amp;#8220;桌面&amp;#8221;，而是直接启动这个组件中指定的应用程序。而且组件中还应该包括一些&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;相关的文件、一些注册表项，还有一些高级设置。稍后我们会看得到。&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;我们还是先打开我们创建组件的工具：&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Component Designer&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;。&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Windows Embedded Standard&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;没有一个完整的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;IDE&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;环境，所以做什么事情的时候要分别打开不同的工具。&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Component Designer&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;的界面如下，我们要先选择&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;File-New&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;创建一个新的组件，然后保存这个组件，并为&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;sld&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;文件设置一个文件名称。&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;接下来，我们要创建一个&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Repositories&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;，这个相当于给组件住的房子。组件是保存在数据库中的，而&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Repositories&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;在数据库中可以起到隔离组件的作用，而且也比较方便我们维护和升级组件。&lt;/span&gt;&lt;/p&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;mso-no-proof: yes&quot;&gt;&lt;v:shapetype id=&quot;_x0000_t75&quot; coordsize=&quot;21600,21600&quot; o:spt=&quot;75&quot; o:preferrelative=&quot;t&quot; path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; filled=&quot;f&quot; stroked=&quot;f&quot;&gt;&lt;v:stroke joinstyle=&quot;miter&quot;&gt;&lt;/v:stroke&gt;&lt;v:formulas&gt;&lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 1 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum 0 0 @1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @2 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 0 1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @6 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @8 21600 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @10 21600 0&quot;&gt;&lt;/v:f&gt;&lt;/v:formulas&gt;&lt;v:path o:extrusionok=&quot;f&quot; gradientshapeok=&quot;t&quot; o:connecttype=&quot;rect&quot;&gt;&lt;/v:path&gt;&lt;o:lock v:ext=&quot;edit&quot; aspectratio=&quot;t&quot;&gt;&lt;/o:lock&gt;&lt;/v:shapetype&gt;
&lt;p align=&quot;center&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/images/cnblogs_com/aawolf/CreateComp1.jpg&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;
&lt;/span&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;我们右键点击上图中&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Repositories&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;节点，选择&amp;#8220;&lt;/span&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;mso-bidi-font-family: Arial&quot;&gt;Add Repository&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;&amp;#8221;来创建一个新的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Repositories&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;。首先为&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Repositories&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;起个名字，写在右侧属性窗口的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;中，然后还要点击&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Source Path&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;后边的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Browse&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;按钮。&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Source Path&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;顾名思义，我们要为该&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Repositories&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;的源文件找一个保存的位置，而我们一般也会把组件所需的文件都放到这个文件夹下。这个文件夹一般没有规定，但是最好放到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;C&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;盘下，自己创建个文件夹就可以了。&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;接下来，我们就该添加组件了，在上图的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Components&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;节点上右键单击，在右键菜单上选择&amp;#8220;&lt;/span&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Add Component&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;&amp;#8221;。&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;创建组件之后，第一件事是在右侧的属性窗口中修改名字。&lt;/span&gt;&lt;/p&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;mso-no-proof: yes&quot;&gt;
&lt;p align=&quot;center&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/images/cnblogs_com/aawolf/CreateComp7.jpg&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;
&lt;/span&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;因为我们创建的这个组件是一个&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Shell&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;组件，所以我们还要规定它在组件库中的原型组件，点击&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Prototype&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;后边的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Browse&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;按钮。&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;我们会看到下图的对话框，初始化可能会花费一些时间。选择&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Software | System | User Interface | Shells&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;下的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Shell Prototype Component&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;组件，作为我们组件的原型组件。&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt; text-align: center&quot; align=&quot;center&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;mso-no-proof: yes&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/images/cnblogs_com/aawolf/comp1.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;接下来还需要点击&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Advanced&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;按钮，定义启动时的自定义动作：&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: center&quot; align=&quot;center&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;mso-no-proof: yes&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.cnblogs.com/images/cnblogs_com/aawolf/CreateComp2.jpg&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;在上面的对话框中，点击&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;按钮添加一个叫做&amp;#8220;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;cmiShellPath&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;&amp;#8221;的扩展属性，类型为&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;，具体指为：&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;%16426%\Internet Explorer\iexplore.exe -k &quot;C:\SilverlightApplication2\Default.html&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt&quot;&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin&quot;&gt;怎么样看着眼熟吧，没错就是启动一个&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;IE&lt;/span&gt;&lt;span style=&quot;font-family: 宋体; mso-fareast-font-f