<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_王德水的个人空间</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/30341/rss</id><updated>2011-10-20T13:22:54Z</updated><author><name>王德水</name><uri>http://www.cnblogs.com/cnblogsfans/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnblogsfans/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/30341/rss"/><entry><id>http://www.cnblogs.com/cnblogsfans/archive/2011/09/02/2163941.html</id><title type="text">ASP.NET MVC3实战系列（三）：MVC3中使用依赖注入(IOC)</title><summary type="text">在ASP.NET MVC3实战系列（二）：面向接口编程，提高系统可测试性。 中我们说之前的程序虽然可以单元测试。 第一就是我们暴露了HomeController的repository的属性。 第二我们在类内部new了一个对象，假如我们这次是从数据库中得到Lovers，下次想从文件或者Web Service里去数据时，我们必须修改Controller里的代码。 在这一节里我们引入一个依赖注...</summary><published>2011-09-02T08:33:00Z</published><updated>2011-09-02T08:33:00Z</updated><author><name>王德水</name><uri>http://www.cnblogs.com/cnblogsfans/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnblogsfans/archive/2011/09/02/2163941.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnblogsfans/archive/2011/09/02/2163941.html"/><content type="html">&lt;p&gt;在&lt;a href="http://http://www.cnblogs.com/cnblogsfans/archive/2011/09/02/2163633.html"&gt;ASP.NET MVC3实战系列（二）：面向接口编程，提高系统可测试性。&lt;/a&gt; 中我们说之前的程序虽然可以单元测试。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;第一就是我们暴露了HomeController的repository的属性。&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;第二我们在类内部new了一个对象，假如我们这次是从数据库中得到Lovers，下次想从文件或者Web Service里去数据时，我们必须修改Controller里的代码。&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在这一节里我们引入一个依赖注入的工具Ninject.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021632083510.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021632106217.png" width="428" height="360" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;点击安装&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110902163214517.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021632185962.png" width="644" height="436" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;修改HomeController为如下代码&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021632187665.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021632208353.png" width="598" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;这样我们就不需要暴露属性了，修改对应的单元测试为如下图所示。测试顺利通过&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110902163221927.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021632228584.png" width="511" height="400" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;但是，当我们运行程序时出错了，因为MVC在实例化Controller时出错，因为没有无参构造函数参数，而我们确要实例化带参的构造函数。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110902163224701.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110902163226932.png" width="644" height="272" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;我们需要自己实例化Controller,所以我们需要建立一个ControllerFactory并让应用程序使用我们自己的这个ControllerFactory&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021632262950.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021632288132.png" width="644" height="406" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;然后在Global.asax.cs里指定使用这个ControllerFactory&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021632299593.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021632297184.png" width="644" height="213" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;按F5运行程序又运行正常了&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110902163231414.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021632337613.png" width="644" height="327" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;至此，这个应用程序已经易于测试了，而且面向了接口编程。易于扩展。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;                &lt;p&gt;&lt;strong&gt;最后，打个小广告：西安分公司急聘如下人员，有意者直接联系我，左边侧栏有我的联系方式，博客园招聘频道有详细描述 &lt;/strong&gt;&lt;a href="http://job.cnblogs.com/offer/13800/"&gt;&lt;strong&gt;http://job.cnblogs.com/offer/13800/&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;基本要求:     &lt;br /&gt;&lt;/strong&gt;4年以上C#开发经验, .Net基础扎实，熟练使用.Net3.5新特性。    &lt;br /&gt;精通ASP.NET Web开发。    &lt;br /&gt;熟练使用WCF.    &lt;br /&gt;熟练使用ORM，LINQ TO SQL /Entity Framework或者NHibernate.    &lt;br /&gt;熟练使用JavaScript, JQuery.    &lt;br /&gt;熟悉Web标准，熟悉HTML&amp;amp;CSS.    &lt;br /&gt;熟悉SQL Server, 熟练掌握T-SQL,存储过程。    &lt;br /&gt;英语读写熟练，可以看懂英文需求，可以和客户流畅的用英语文字沟通(MSN/Skype)    &lt;br /&gt;良好的编码习惯。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;熟悉下面任意一项优先:&lt;/strong&gt;    &lt;br /&gt;熟悉敏捷开发者优先    &lt;br /&gt;英语听说熟练者优先    &lt;br /&gt;熟悉ASP.NET MVC者优先。    &lt;br /&gt;熟悉WPF者优先    &lt;br /&gt;熟悉Silverlight优先    &lt;br /&gt;有系统架构经验者优先，有单元测试或者TDD经验者优先。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cnblogsfans/aggbug/2163941.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/09/02/2163941.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnblogsfans/archive/2011/09/02/2163633.html</id><title type="text">ASP.NET MVC3实战系列（二）：面向接口编程，提高系统可测试性。</title><summary type="text">ASP.NET MVC 使用MVC的架构，其架构本身就使应用程序更易于测试，但这并不意味着可以随便写出易于测试的程序。我们都知道单元测试在系统开发有着很重要的作用。 我们来写这样的一个程序，系统获取某个坏男人的情人信息，然后发送给他老婆。 1. 建一个Lover的ASP.NET MVC3项目 我们需要1个实体类，存储男人，情人和老婆的信息。 然后我们需要一个LoverRepo...</summary><published>2011-09-02T05:47:00Z</published><updated>2011-09-02T05:47:00Z</updated><author><name>王德水</name><uri>http://www.cnblogs.com/cnblogsfans/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnblogsfans/archive/2011/09/02/2163633.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnblogsfans/archive/2011/09/02/2163633.html"/><content type="html">&lt;p&gt;ASP.NET MVC 使用MVC的架构，其架构本身就使应用程序更易于测试，但这并不意味着可以随便写出易于测试的程序。我们都知道单元测试在系统开发有着很重要的作用。&lt;/p&gt;  &lt;p&gt;我们来写这样的一个程序，系统获取某个坏男人的情人信息，然后发送给他老婆。&lt;/p&gt;  &lt;p&gt;1. 建一个Lover的ASP.NET MVC3项目&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021345518926.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021345525154.png" width="207" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;我们需要1个实体类，存储男人，情人和老婆的信息。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021345532156.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021345533617.png" width="341" height="189" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;然后我们需要一个LoverRepository来获取某个人的情人，这里就想成从数据库取数据。我们这里先返回固定的数据&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021345552354.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021345571256.png" width="585" height="441" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;建一个HomeController, 代码如下&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021345598672.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346002392.png" width="445" height="304" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;建立一个Index视图&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346018870.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346055461.png" width="526" height="291" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;建立一个Send 视图&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346091398.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346168569.png" width="535" height="248" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;F5运行&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346236820.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346249394.png" width="292" height="142" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346256113.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346262591.png" width="244" height="99" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2. 重构这个小程序。&lt;/p&gt;  &lt;p&gt;我们可以看到如果我们想测试HomeController里Send的这个Action，&lt;font color="#ff0000"&gt;如果LoverRepository没有开发完或者出错，我们将无法测试&lt;/font&gt;。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346263737.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110902134629413.png" width="431" height="217" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346294383.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110902134630545.png" width="437" height="142" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;可以看到单元测试出错了。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346307023.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346311549.png" width="445" height="159" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;那么我们如何来隔离LoveRepository呢？我们都知道面向接口编程可以提高系统的可测试性。&lt;/p&gt;  &lt;p&gt;打开LoveRepository.cs, 右键重构为接口：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346348466.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110902134638814.png" width="595" height="368" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346398994.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346419259.png" width="594" height="384" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346426260.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110902134643296.png" width="475" height="169" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346431442.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346442936.png" width="480" height="271" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;为了容易测试，我们把这个接口属性设为公有。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346451640.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346461739.png" width="508" height="304" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;这时我们再自己可以实现一个FakeRepository继承ILoverRepository这个接口,这样就测试通过了。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110902134647725.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109021346497543.png" width="509" height="409" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;但是这样有几个问题：&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;第一就是我们暴露了HomeController的repository的属性。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;第二我们在类内部new了一个对象，假如我们这次是从数据库中得到Lovers，下次想从文件或者Web Service里去数据时，我们必须修改Controller里的代码。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;第三我们需要自己写一个Fake类。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;要想解决这些问题，下一节我们将讨论ASP.NET MVC3里如何使用IOC来解决对象的依赖问题。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;最后，打个小广告：西安分公司急聘如下人员，有意者直接联系我，左边侧栏有我的联系方式，博客园招聘频道有详细描述 &lt;/strong&gt;&lt;a href="http://job.cnblogs.com/offer/13800/"&gt;&lt;strong&gt;http://job.cnblogs.com/offer/13800/&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;基本要求:     &lt;br /&gt;&lt;/strong&gt;4年以上C#开发经验, .Net基础扎实，熟练使用.Net3.5新特性。    &lt;br /&gt;精通ASP.NET Web开发。    &lt;br /&gt;熟练使用WCF.    &lt;br /&gt;熟练使用ORM，LINQ TO SQL /Entity Framework或者NHibernate.    &lt;br /&gt;熟练使用JavaScript, JQuery.    &lt;br /&gt;熟悉Web标准，熟悉HTML&amp;amp;CSS.    &lt;br /&gt;熟悉SQL Server, 熟练掌握T-SQL,存储过程。    &lt;br /&gt;英语读写熟练，可以看懂英文需求，可以和客户流畅的用英语文字沟通(MSN/Skype)    &lt;br /&gt;良好的编码习惯。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;熟悉下面任意一项优先:&lt;/strong&gt;    &lt;br /&gt;熟悉敏捷开发者优先    &lt;br /&gt;英语听说熟练者优先    &lt;br /&gt;熟悉ASP.NET MVC者优先。    &lt;br /&gt;熟悉WPF者优先    &lt;br /&gt;熟悉Silverlight优先    &lt;br /&gt;有系统架构经验者优先，有单元测试或者TDD经验者优先。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cnblogsfans/aggbug/2163633.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/09/02/2163633.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnblogsfans/archive/2011/09/01/2162227.html</id><title type="text">ASP.NET MVC3实战系列（一）：简单示例</title><summary type="text">ASP.NET MVC已经推出时间不短了，已经有很多项目在使用这个优秀的WEB开发框架。因为我们项目每次加人的时候，对MVC都不是特别熟悉，有一些人认为这个非常简单，导致写出来的程序完全不是MVC的，所以我就想写个系列总结一下实战中的经验和一些学习的笔记。我们先不谈论MVC的好处，等我们写过一些程序和示例后，再回来谈。 首先，我们先用MVC写一个简单的ASP.NET MVC3的程序来简单的了解一...</summary><published>2011-09-01T09:07:00Z</published><updated>2011-09-01T09:07:00Z</updated><author><name>王德水</name><uri>http://www.cnblogs.com/cnblogsfans/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnblogsfans/archive/2011/09/01/2162227.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnblogsfans/archive/2011/09/01/2162227.html"/><content type="html">&lt;p&gt;ASP.NET MVC已经推出时间不短了，已经有很多项目在使用这个优秀的WEB开发框架。因为我们项目每次加人的时候，对MVC都不是特别熟悉，有一些人认为这个非常简单，导致写出来的程序完全不是MVC的，所以我就想写个系列总结一下实战中的经验和一些学习的笔记。我们先不谈论MVC的好处，等我们写过一些程序和示例后，再回来谈。&lt;/p&gt;  &lt;p&gt;首先，我们先用MVC写一个简单的ASP.NET MVC3的程序来简单的了解一下。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;环境：&lt;/p&gt;  &lt;p&gt;VS2010&lt;/p&gt;  &lt;p&gt;ASP.NET MVC3&lt;/p&gt;  &lt;p&gt;在&lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;http://www.microsoft.com/web/downloads/platform.aspx&lt;/a&gt; 下载Microsoft Web Platform Installer 3.0，在Microsoft Web Platform Installer 3.0上可以在线下载到需要的软件。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705081025.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705113307.png" width="515" height="358" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;示例程序&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1. 显示一个简单的字符串“Hello World”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;新建ASP.NET MVC3 Web Application&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705132491.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705174458.png" width="523" height="323" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;选择Razor视图引擎&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705189083.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705208201.png" width="538" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705211299.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705213350.png" width="244" height="229" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;按F5启动应用程序&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705243647.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705263463.png" width="644" height="205" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;我们看到出错了，这是因为在MVC里，请求被Controller处理，现在还没有任何Controller,下面我们添加一个Controller, 右键Controller添加一个HomeController&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705276419.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705297763.png" width="491" height="376" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705311832.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110901170532602.png" width="501" height="327" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;修改HomeController里的Index方法为如下&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705338159.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705343765.png" width="326" height="279" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;F5运行后如下所示&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705347768.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705359819.png" width="244" height="106" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;为什么可以运行成功，这要归功于ASP.NET MVC的路由机制，我们看一下Global.asax.cs里的如下代码&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705366505.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705373539.png" width="644" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;从这行代码里可以看到系统默认请求被路由到HomeController和Index这个Action（MVC里把Controller里公有方法称之为Action,两者之间是有区别的)。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2. 显示一个视图：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;如果都像刚才那样直接写字符串到客户端，那开发人员肯定疯了，现在我们显示一个视图。先把HomeController里的Action改为如下代码，按F5&lt;/p&gt;  &lt;pre &gt;namespace HelloWorld.Controllers&#xD;
{&#xD;
    public class HomeController : Controller&#xD;
    {&#xD;
        //&#xD;
        // GET: /Home/&#xD;
&#xD;
        public ActionResult Index()&#xD;
        {&#xD;
            return View();&#xD;
        }&#xD;
&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705399376.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705413968.png" width="644" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;根据提示，我们在错误提示的任何一个位置添加对应的文件就可以了，这里我们在Views/Home文件夹下添加Index.aspx, 在HomeController里右键点击Index方法名，选择Add View&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110901170543612.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705463483.png" width="558" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705484695.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705506878.png" width="494" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;点击确定，修改index.aspx为如下内容&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705517010.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705545879.png" width="435" height="400" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;F5运行，我们看到显示和之前相同的结果&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705547930.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705558901.png" width="281" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;3. 添加动态内容&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;添加如下代码&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705567015.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705579589.png" width="413" height="282" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;修改Index.aspx视图为如下&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705577703.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011705597868.png" width="498" height="378" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;F5运行&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706009047.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706012560.png" width="502" height="148" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;ViewBag是Controller定义的一个动态类型的属性，意味着你可以给他添加任何属性，在编译时动态类型的属性是不检查的。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110901170602674.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110901170603806.png" width="528" height="162" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;4. 强类型视图&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;动态类型编译时不能检查，开发时没有只能提示是意见很不爽的时，下面我们来定义一个强类型的视图。先定义一个Person类&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706049759.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706045922.png" width="268" height="223" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;删除Index.aspx, Ctrl+Shift+B 编译一下，右键Action—&amp;gt;Add View&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706051593.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706087190.png" width="494" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;修改Index.aspx&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706099797.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706109581.png" width="412" height="349" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;我们可以看到强类型的智能提示&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706119995.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706148407.png" width="644" height="428" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;F5运行&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;我们可以看到生成的HTML和页面&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706173654.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706201476.png" width="662" height="521" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在Controller里添加如下方法&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706203178.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706227280.png" width="618" height="470" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;提交表单显示如下，&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/20110901170623444.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706249987.png" width="327" height="105" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;之所以能够显示出名字，是因为ASP.NET MVC通过Binder机制把表单Post的数据赋给参数对象对应的属性，我们可以通过Firebug看一下表单Post的数据&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706267087.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706288987.png" width="644" height="423" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;5. 添加验证&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;修改Person 这个Modal为如下，记得引用红色标注的命名空间&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706293514.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706318728.png" width="616" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;视图里添加如下红色标注的内容&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706325763.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706374339.png" width="472" height="268" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;修改Action里的代码如下&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706379389.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706382835.png" width="644" height="311" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;F5运行,不输入任何代码提交表单&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706413132.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201109/201109011706453594.png" width="694" height="476" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;至此，我们完成了一个简单的MVC3的程序，里面演示的MVC3的一些基本特性。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;最后，打个小广告：西安分公司急聘如下人员，有意者直接联系我，左边侧栏有我的联系方式，博客园招聘频道有详细描述 &lt;/strong&gt;&lt;/font&gt;&lt;a title="http://job.cnblogs.com/offer/13800/" href="http://job.cnblogs.com/offer/13800/"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;http://job.cnblogs.com/offer/13800/&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;&lt;strong&gt;基本要求:&#xD;
      &lt;br /&gt;&lt;/strong&gt;4年以上C#开发经验, .Net基础扎实，熟练使用.Net3.5新特性。&#xD;
&#xD;
    &lt;br /&gt;精通ASP.NET Web开发。&#xD;
&#xD;
    &lt;br /&gt;熟练使用WCF.&#xD;
&#xD;
    &lt;br /&gt;熟练使用ORM，LINQ TO SQL /Entity Framework或者NHibernate.&#xD;
&#xD;
    &lt;br /&gt;熟练使用JavaScript, JQuery.&#xD;
&#xD;
    &lt;br /&gt;熟悉Web标准，熟悉HTML&amp;amp;CSS.&#xD;
&#xD;
    &lt;br /&gt;熟悉SQL Server, 熟练掌握T-SQL,存储过程。&#xD;
&#xD;
    &lt;br /&gt;英语读写熟练，可以看懂英文需求，可以和客户流畅的用英语文字沟通(MSN/Skype)&#xD;
&#xD;
    &lt;br /&gt;良好的编码习惯。&lt;/font&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;&#xD;
    &lt;br /&gt;&lt;strong&gt;熟悉下面任意一项优先:&lt;/strong&gt;&#xD;
&#xD;
    &lt;br /&gt;熟悉敏捷开发者优先&#xD;
&#xD;
    &lt;br /&gt;英语听说熟练者优先&#xD;
&#xD;
    &lt;br /&gt;熟悉ASP.NET MVC者优先。&#xD;
&#xD;
    &lt;br /&gt;熟悉WPF者优先&#xD;
&#xD;
    &lt;br /&gt;熟悉Silverlight优先&#xD;
&#xD;
    &lt;br /&gt;有系统架构经验者优先，有单元测试或者TDD经验者优先。&lt;/font&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cnblogsfans/aggbug/2162227.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/09/01/2162227.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnblogsfans/archive/2011/08/11/2135335.html</id><title type="text">ASP.NET MVC 相同Controller的解决办法</title><summary type="text">今天做的MVC程序里，有两个WebSite,有两个不同命名空间的HomeController,网站启动时，/Home/Index, 提示有两个HomeController. 系统不知道使用哪一个 register this route by calling an overload of the &amp;#39;MapRoute&amp;#39; method that takes a &amp;#39;namespaces&amp;#39; paramet...</summary><published>2011-08-11T09:44:00Z</published><updated>2011-08-11T09:44:00Z</updated><author><name>王德水</name><uri>http://www.cnblogs.com/cnblogsfans/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnblogsfans/archive/2011/08/11/2135335.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnblogsfans/archive/2011/08/11/2135335.html"/><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;今天做的MVC程序里，有两个WebSite,有两个不同命名空间的HomeController,网站启动时，/Home/Index, 提示有两个HomeController. 系统不知道使用哪一个&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;解决办法:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;1. 在路由注册时，加上各自的命名空间&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;routes.MapRoute(&amp;quot;Default&amp;quot;, &amp;quot;{controller}/{action}/{id}&amp;quot;, new { controller = &amp;quot;Home&amp;quot;, action = &amp;quot;Index&amp;quot;, id = UrlParameter.Optional },null, new string[]{&amp;quot;Video.CMS.Controller.*&amp;quot;}&lt;/p&gt;  &lt;p&gt;2. 在Application_Start里&lt;/p&gt;  &lt;p&gt;AreaRegistration.RegisterAllAreas();&lt;/p&gt;  &lt;p&gt;RegisterRoutes(RouteTable.Routes);&lt;/p&gt;  &lt;p&gt;之后加上:&lt;/p&gt;  &lt;p&gt;ControllerBuilder.Current.DefaultNamespaces.Add(&amp;quot;Video.CMS.Controller.*&amp;quot;);&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cnblogsfans/aggbug/2135335.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/08/11/2135335.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnblogsfans/archive/2011/04/11/2013054.html</id><title type="text">如何帮别人快速认识敏捷</title><summary type="text">最近，有个很好的朋友在路上和我聊天，说我看你们老说敏捷，你能给我说说什么是敏捷吗？ 我说：敏捷是一种价值观。 友问：哦，是什么价值观？ 我说：遵守敏捷宣言的价值观？你知道敏捷宣言吗？ 友说：不知道。 我说：敏捷价值观是，个体和交互胜过过程和文档。。。 友问：为什么个体和交互胜过过程和文档，为什么。。。 我说： 因为如是这般。。。 还没说完，就到站了，朋友要走了，回来我就开始思考如何让人对敏捷有个快...</summary><published>2011-04-11T14:56:00Z</published><updated>2011-04-11T14:56:00Z</updated><author><name>王德水</name><uri>http://www.cnblogs.com/cnblogsfans/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnblogsfans/archive/2011/04/11/2013054.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnblogsfans/archive/2011/04/11/2013054.html"/><content type="html">&lt;p&gt;最近，有个很好的朋友在路上和我聊天，说我看你们老说敏捷，你能给我说说什么是敏捷吗？&lt;/p&gt;  &lt;p&gt;我说：敏捷是一种价值观。&lt;/p&gt;  &lt;p&gt;友问：哦，是什么价值观？&lt;/p&gt;  &lt;p&gt;我说：遵守敏捷宣言的价值观？你知道敏捷宣言吗？&lt;/p&gt;  &lt;p&gt;友说：不知道。&lt;/p&gt;  &lt;p&gt;我说：敏捷价值观是，个体和交互胜过过程和文档。。。&lt;/p&gt;  &lt;p&gt;友问：为什么个体和交互胜过过程和文档，为什么。。。&lt;/p&gt;  &lt;p&gt;我说： 因为如是这般。。。 &lt;/p&gt;  &lt;p&gt;还没说完，就到站了，朋友要走了，回来我就开始思考如何让人对敏捷有个快速的了解，也就是短时间内了解敏捷的一些精髓。这个我们向客户推敏捷的时候其实也经常碰到上面的场景，客户也同样没有时间而且不可能有很多时间听我们讲敏捷。&lt;/p&gt;  &lt;p&gt;随后，我回来仔细想了想，我们如何让别人很容易理解并接收敏捷呢？&lt;/p&gt;  &lt;p&gt;1. 我们必须让他用自己的语言和经历可以轻松的理解。&lt;/p&gt;  &lt;p&gt;2. 必须找出敏捷的最重要和最显著的特点。&lt;/p&gt;  &lt;p&gt;3. 必须让他们明白敏捷带来的好处，而不只是工作流程的改变。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;这两年我也一直学习和实践敏捷，正确使用敏捷确确实实可以解决很多问题，注意，我这里说的是很多，并没有说所有。同时，可以大大增加项目的成功率。&lt;/p&gt;  &lt;p&gt;这里不说SCRUM, 不说XP, 下面是我给敏捷的一个很山寨的定义：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;敏捷就是以客户商业价值驱动的增量的提交，每个迭代一般持续2到4周，每个迭代结束向客户提供迭代初承诺的高质量的可以工作的软件，整个团队持续改进同等时间的工作效率和工作质量。敏捷可以提高团队的战斗力，个人能力随着团队能力的提高同步提高，敏捷可以极大提高解决新问题或未知领域的能力。敏捷在提高工作效率和工作质量的同时可以提高个人的成就感和生活质量。敏捷最大的挑战就是找到敏捷的人（爱学习和上进的人）和一个好的敏捷教练来正确推行敏捷。敏捷是一种思想和价值观，不只是使用在软件领域。&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;之前，看了一篇文章，很多人错误的使用了敏捷，然后就很不愿意接受敏捷，这是不对的，我认为这并不是敏捷本身的错，而是少了一个好的敏捷教练。我见的大部分使用敏捷的失败的原因都是拿着瀑布的方式，或者命令和控制的管理方式来使用敏捷。我就发现很多人用WinForm的思想使用WPF,后者使用WebForm的方式来使用MVC. 然后说WPF太麻烦，说MVC不好，这并不是WPF和MVC的问题，我们应该使用一个东西的优点。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;本篇文章，你只需看黑色字体就可以了，因为我的目的就是快速让一个人知道敏捷是什么东西，我觉得一个敏捷的人，如果他现在使用别的过程遇到问题的话，他自己会有更多的理解或者回去查资料去了解。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;祝大家晚安，工作生活愉快&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cnblogsfans/aggbug/2013054.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/04/11/2013054.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnblogsfans/archive/2011/03/01/1967858.html</id><title type="text">无废话WPF系列19：MVVM简单介绍</title><summary type="text">MVVM主要是为了逻辑代码和视图的分离，使CodeBehind只包含对UI的操作。通过绑定和Command来实现 下面我们实现一个最简单的示例，点击按钮使年龄加1. XAML代码 &amp;lt;Window x:Class=&amp;quot;DeepXAML.MainWindow&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot; xmlns:...</summary><published>2011-03-01T04:33:00Z</published><updated>2011-03-01T04:33:00Z</updated><author><name>王德水</name><uri>http://www.cnblogs.com/cnblogsfans/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnblogsfans/archive/2011/03/01/1967858.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnblogsfans/archive/2011/03/01/1967858.html"/><content type="html">&lt;p&gt;MVVM主要是为了逻辑代码和视图的分离，使CodeBehind只包含对UI的操作。通过绑定和Command来实现&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201103/201103011233004803.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201103/201103011233151234.png" width="660" height="340" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;下面我们实现一个最简单的示例，点击按钮使年龄加1.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201103/201103011233196344.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201103/201103011233227966.png" width="244" height="217" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;XAML代码&lt;/p&gt;  &lt;pre &gt;&amp;lt;Window x:Class=&amp;quot;DeepXAML.MainWindow&amp;quot;&#xD;
        xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&#xD;
        xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&#xD;
        xmlns:local=&amp;quot;clr-namespace:DeepXAML&amp;quot;       &#xD;
        xmlns:sys=&amp;quot;clr-namespace:System;assembly=mscorlib&amp;quot;&#xD;
         xmlns:cl=&amp;quot;clr-namespace:System.Collections;assembly=mscorlib&amp;quot;&#xD;
        Title=&amp;quot;MainWindow&amp;quot; Height=&amp;quot;250&amp;quot; Width=&amp;quot;450&amp;quot;&amp;gt;&#xD;
       &amp;lt;StackPanel&amp;gt;&#xD;
        &amp;lt;TextBox Text=&amp;quot;{Binding Path=Name}&amp;quot;&amp;gt;&amp;lt;/TextBox&amp;gt;&#xD;
        &amp;lt;TextBox Text=&amp;quot;{Binding Path=Age}&amp;quot;&amp;gt;&amp;lt;/TextBox&amp;gt;&#xD;
        &amp;lt;Button Command=&amp;quot;{Binding Path=AddAge}&amp;quot; &amp;gt;Add Age&amp;lt;/Button&amp;gt;&#xD;
    &amp;lt;/StackPanel&amp;gt;&#xD;
&amp;lt;/Window&amp;gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;MainPageViewModel&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;public class MainPageViewModel : INotifyPropertyChanged&#xD;
    {&#xD;
        public event PropertyChangedEventHandler PropertyChanged;&#xD;
&#xD;
        private string name;&#xD;
        public string Name {&#xD;
            get { return name; }&#xD;
            set {&#xD;
                name = value;&#xD;
                if (this.PropertyChanged != null)&#xD;
                {&#xD;
                    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(&amp;quot;Name&amp;quot;));&#xD;
                }&#xD;
            }&#xD;
        }&#xD;
&#xD;
        private int age;&#xD;
        public int Age {&#xD;
            get { return age; }&#xD;
            set&#xD;
            {&#xD;
                age = value;&#xD;
                if (this.PropertyChanged != null)&#xD;
                {&#xD;
                    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(&amp;quot;Age&amp;quot;));&#xD;
                }&#xD;
            }&#xD;
        }&#xD;
&#xD;
        public ICommand AddAge&#xD;
        {&#xD;
            get { return new AddAgeCommand(this); }&#xD;
        }&#xD;
&#xD;
    }&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;public class AddAgeCommand : ICommand&#xD;
    {&#xD;
        private MainPageViewModel mMainPageViewModel;&#xD;
        public AddAgeCommand(MainPageViewModel model)&#xD;
        {&#xD;
            mMainPageViewModel = model;&#xD;
        }&#xD;
&#xD;
        public bool CanExecute(object parameter)&#xD;
        {&#xD;
            return true;&#xD;
           &#xD;
        }&#xD;
&#xD;
        public event EventHandler CanExecuteChanged;&#xD;
&#xD;
        public void Execute(object parameter)&#xD;
        {&#xD;
            this.mMainPageViewModel.Age += 1;&#xD;
        }&#xD;
    }&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;我们可以看一下后台只有很少代码：&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;public partial class MainWindow : Window&#xD;
    {&#xD;
        public MainWindow()&#xD;
        {&#xD;
            InitializeComponent();&#xD;
            MainPageViewModel mainPageViewModel = new MainPageViewModel { Age = 20, Name = &amp;quot;Jack&amp;quot; };&#xD;
            this.DataContext = mainPageViewModel;&#xD;
        }      &#xD;
    }&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/cnblogsfans/aggbug/1967858.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/03/01/1967858.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966182.html</id><title type="text">WPF学习笔记系列</title><summary type="text">之前有过Silverlight使用经验，最近学习了一下WPF，在学习的过程中以博客的方式记了笔记，本笔记尽量去掉已经明白的东西，所以就叫做无废话系列，希望对想开始学WPF的人有用。 无废话WPF系列1：XAML分析 无废话WPF系列2: InitializeComponent方法定义哪里 无废话WPF系列3: XAML中为对象属性赋值 无废话WPF系列4: x名称空间 无废话WPF系列5：控件派生...</summary><published>2011-02-27T03:27:00Z</published><updated>2011-02-27T03:27:00Z</updated><author><name>王德水</name><uri>http://www.cnblogs.com/cnblogsfans/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966182.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966182.html"/><content type="html">&lt;p&gt;之前有过Silverlight使用经验，最近学习了一下WPF，在学习的过程中以博客的方式记了笔记，本笔记尽量去掉已经明白的东西，所以就叫做无废话系列，希望对想开始学WPF的人有用。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958573.html"&gt;无废话WPF系列1：XAML分析&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958575.html"&gt;无废话WPF系列2: InitializeComponent方法定义哪里&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958577.html"&gt;无废话WPF系列3: XAML中为对象属性赋值&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958578.html"&gt;无废话WPF系列4: x名称空间&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958579.html"&gt;无废话WPF系列5：控件派生图&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958581.html"&gt;无废话WPF系列6：各类控件家族详解&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958582.html"&gt;无废话WPF系列7：WPF布局控件&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958583.html"&gt;无废话WPF系列8：绑定Binding及模式&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958586.html"&gt;无废话WPF系列9: Binding的源&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958646.html"&gt;无废话WPF系列10: Binding对数据的检验&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/19/1958658.html"&gt;无废话WPF系列11: 数据转换&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966165.html"&gt;无废话WPF系列12: 依赖属性和附加属性&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966166.html"&gt;无废话WPF系列13：路由事件&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966167.html"&gt;无废话WPF系列14：命令&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966168.html"&gt;无废话WPF系列15：样式&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966170.html"&gt;无废话WPF系列16：资源&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966172.html"&gt;无废话WPF系列17：数据模版&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966176.html"&gt;无废话WPF系列18：控件模版&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cnblogsfans/aggbug/1966182.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966182.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966176.html</id><title type="text">无废话WPF系列18：控件模版</title><summary type="text">控件模版ControlTemplate就是设置控件的外观，比如我们常见到的按钮是下面这样的，但是我们如何改变成圆形的呢?  &amp;lt;Window x:Class=&amp;quot;DeepXAML.MainWindow&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot; xmlns:x=&amp;quot;http://schemas.microsoft....</summary><published>2011-02-27T03:15:00Z</published><updated>2011-02-27T03:15:00Z</updated><author><name>王德水</name><uri>http://www.cnblogs.com/cnblogsfans/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966176.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966176.html"/><content type="html">&lt;p&gt;控件模版ControlTemplate就是设置控件的外观，比如我们常见到的按钮是下面这样的，但是我们如何改变成圆形的呢?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271115276270.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271115287043.png" width="244" height="117" /&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271115288613.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271115283597.png" width="208" height="117" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre &gt;&amp;lt;Window x:Class=&amp;quot;DeepXAML.MainWindow&amp;quot;&#xD;
        xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&#xD;
        xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&#xD;
        xmlns:local=&amp;quot;clr-namespace:DeepXAML&amp;quot;       &#xD;
        xmlns:sys=&amp;quot;clr-namespace:System;assembly=mscorlib&amp;quot;&#xD;
        Title=&amp;quot;MainWindow&amp;quot; Height=&amp;quot;250&amp;quot; Width=&amp;quot;450&amp;quot;&amp;gt;&#xD;
    &amp;lt;Window.Resources&amp;gt;&#xD;
        &amp;lt;Style x:Key=&amp;quot;roundButton&amp;quot; TargetType=&amp;quot;Button&amp;quot;&amp;gt;&#xD;
            &amp;lt;Setter Property=&amp;quot;Background&amp;quot;&amp;gt;&#xD;
                &amp;lt;Setter.Value&amp;gt;&#xD;
                    &amp;lt;LinearGradientBrush StartPoint=&amp;quot;0.5,0&amp;quot; EndPoint=&amp;quot;0.5,1&amp;quot;&amp;gt;&#xD;
                        &amp;lt;LinearGradientBrush.GradientStops&amp;gt;&#xD;
                            &amp;lt;GradientStop Offset=&amp;quot;0.0&amp;quot; Color=&amp;quot;#fff&amp;quot; /&amp;gt;&#xD;
                            &amp;lt;GradientStop Offset=&amp;quot;1.0&amp;quot; Color=&amp;quot;Red&amp;quot; /&amp;gt;&#xD;
                        &amp;lt;/LinearGradientBrush.GradientStops&amp;gt;&#xD;
                    &amp;lt;/LinearGradientBrush&amp;gt;&#xD;
                &amp;lt;/Setter.Value&amp;gt;&#xD;
            &amp;lt;/Setter&amp;gt;&#xD;
            &amp;lt;Setter Property=&amp;quot;Template&amp;quot;&amp;gt;&#xD;
                &amp;lt;Setter.Value&amp;gt;&#xD;
                    &amp;lt;ControlTemplate TargetType=&amp;quot;Button&amp;quot;&amp;gt;&#xD;
                        &amp;lt;Grid&amp;gt;&#xD;
                            &amp;lt;Ellipse Fill=&amp;quot;{TemplateBinding Background}&amp;quot;&amp;gt;&amp;lt;/Ellipse&amp;gt;&#xD;
                            &amp;lt;ContentPresenter Margin=&amp;quot;5&amp;quot; HorizontalAlignment=&amp;quot;Center&amp;quot; VerticalAlignment=&amp;quot;Center&amp;quot; /&amp;gt;                        &amp;lt;/Grid&amp;gt;                   &#xD;
                    &amp;lt;/ControlTemplate&amp;gt;&#xD;
                &amp;lt;/Setter.Value&amp;gt;&#xD;
            &amp;lt;/Setter&amp;gt;&#xD;
        &amp;lt;/Style&amp;gt;    &#xD;
    &amp;lt;/Window.Resources&amp;gt;&#xD;
    &amp;lt;StackPanel x:Name=&amp;quot;stackPanel&amp;quot;&amp;gt;&#xD;
        &amp;lt;Button Width=&amp;quot;200&amp;quot; Height=&amp;quot;120&amp;quot; Margin=&amp;quot;20&amp;quot; Style=&amp;quot;{StaticResource ResourceKey=roundButton}&amp;quot;&amp;gt;OK&amp;lt;/Button&amp;gt;&#xD;
    &amp;lt;/StackPanel&amp;gt;&#xD;
&amp;lt;/Window&amp;gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;font color="#ff0000"&gt;ItemsControl有个PanelTemplate可以控制ItemsControl的条目容器。&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cnblogsfans/aggbug/1966176.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966176.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966172.html</id><title type="text">无废话WPF系列17：数据模版</title><summary type="text">WPF模版主要分为俩大类： ControlTemplate: 控件的外观，也就是控件是什么样子 DataTemplate: 是数据内容的表现，一条数据显示成什么样子 1. 数据模版常用的地方有以下几处： ContentControl的ContentTemplate属性。 ItemsControl的ItemTemplate属性。 GridViewColumn的CellTemplate属性。 2. 示...</summary><published>2011-02-27T03:14:00Z</published><updated>2011-02-27T03:14:00Z</updated><author><name>王德水</name><uri>http://www.cnblogs.com/cnblogsfans/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966172.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966172.html"/><content type="html">&lt;p&gt;WPF模版主要分为俩大类：&lt;/p&gt;  &lt;p&gt;ControlTemplate: 控件的外观，也就是控件是什么样子&lt;/p&gt;  &lt;p&gt;DataTemplate: 是数据内容的表现，一条数据显示成什么样子&lt;/p&gt;  &lt;p&gt;1. 数据模版常用的地方有以下几处：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ContentControl的ContentTemplate属性。 &lt;/li&gt;    &lt;li&gt;ItemsControl的ItemTemplate属性。 &lt;/li&gt;    &lt;li&gt;GridViewColumn的CellTemplate属性。 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;2. 示例&lt;/p&gt;  &lt;p&gt;ItemsControl&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271113004962.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271113036551.png" width="644" height="288" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271113064858.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271113097526.png" width="564" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271113106871.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271113135178.png" width="563" height="315" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ContentControl&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271113148983.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271114151705.png" width="801" height="213" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271114176457.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/20110227111418229.png" width="336" height="189" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;3. DataTemplate除了可以作用在控件上，也可以作用再数据类型上&lt;/p&gt;  &lt;pre &gt;&amp;lt;Window x:Class=&amp;quot;DeepXAML.MainWindow&amp;quot;&#xD;
        xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&#xD;
        xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&#xD;
        xmlns:local=&amp;quot;clr-namespace:DeepXAML&amp;quot;       &#xD;
        xmlns:sys=&amp;quot;clr-namespace:System;assembly=mscorlib&amp;quot;&#xD;
         xmlns:cl=&amp;quot;clr-namespace:System.Collections;assembly=mscorlib&amp;quot;&#xD;
        Title=&amp;quot;MainWindow&amp;quot; Height=&amp;quot;250&amp;quot; Width=&amp;quot;450&amp;quot;&amp;gt;&#xD;
    &amp;lt;Window.Resources&amp;gt;&#xD;
        &amp;lt;DataTemplate DataType=&amp;quot;{x:Type local:Student}&amp;quot;&amp;gt;            &#xD;
            &amp;lt;StackPanel Orientation=&amp;quot;Horizontal&amp;quot; &amp;gt;&#xD;
            &amp;lt;Grid Margin=&amp;quot;5&amp;quot;&amp;gt;                &#xD;
                &amp;lt;Rectangle Fill=&amp;quot;YellowGreen&amp;quot;  Width=&amp;quot;{Binding  Path=Score}&amp;quot;/&amp;gt;&#xD;
                &amp;lt;TextBlock  Text=&amp;quot;{Binding Path=Name}&amp;quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;&#xD;
            &amp;lt;/Grid&amp;gt;&#xD;
                &amp;lt;TextBlock Text=&amp;quot;{Binding Path=Score}&amp;quot; Margin=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;&#xD;
            &amp;lt;/StackPanel&amp;gt;&#xD;
        &amp;lt;/DataTemplate&amp;gt;&#xD;
        &amp;lt;cl:ArrayList x:Key=&amp;quot;allStudentsList&amp;quot;&amp;gt;&#xD;
            &amp;lt;local:Student Name=&amp;quot;Jack&amp;quot; Gender=&amp;quot;True&amp;quot; Score=&amp;quot;80&amp;quot;&amp;gt;&amp;lt;/local:Student&amp;gt;&#xD;
            &amp;lt;local:Student Name=&amp;quot;Tom&amp;quot; Gender=&amp;quot;False&amp;quot; Score=&amp;quot;40&amp;quot;&amp;gt;&amp;lt;/local:Student&amp;gt;&#xD;
            &amp;lt;local:Student Name=&amp;quot;Jack&amp;quot; Gender=&amp;quot;True&amp;quot; Score=&amp;quot;75&amp;quot;&amp;gt;&amp;lt;/local:Student&amp;gt;&#xD;
        &amp;lt;/cl:ArrayList&amp;gt;&#xD;
    &amp;lt;/Window.Resources&amp;gt;&#xD;
    &amp;lt;StackPanel x:Name=&amp;quot;stackPanel&amp;quot;&amp;gt;&#xD;
        &amp;lt;ListBox ItemsSource=&amp;quot;{StaticResource ResourceKey=allStudentsList}&amp;quot; FontSize=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;/ListBox&amp;gt;&#xD;
        &amp;lt;TextBlock Margin=&amp;quot;10&amp;quot;&amp;gt;Below is combox&amp;lt;/TextBlock&amp;gt;&#xD;
        &amp;lt;ComboBox ItemsSource=&amp;quot;{StaticResource ResourceKey=allStudentsList}&amp;quot; FontSize=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;/ComboBox&amp;gt;&#xD;
    &amp;lt;/StackPanel&amp;gt;&#xD;
&amp;lt;/Window&amp;gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271114195670.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271114216552.png" width="454" height="279" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;4. DataTemplate作用在XML元素上&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&amp;lt;Window x:Class=&amp;quot;DeepXAML.MainWindow&amp;quot;&#xD;
        xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&#xD;
        xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&#xD;
        xmlns:local=&amp;quot;clr-namespace:DeepXAML&amp;quot;       &#xD;
        xmlns:sys=&amp;quot;clr-namespace:System;assembly=mscorlib&amp;quot;&#xD;
         xmlns:cl=&amp;quot;clr-namespace:System.Collections;assembly=mscorlib&amp;quot;&#xD;
        Title=&amp;quot;MainWindow&amp;quot; Height=&amp;quot;250&amp;quot; Width=&amp;quot;450&amp;quot;&amp;gt;&#xD;
    &amp;lt;Window.Resources&amp;gt;&#xD;
        &amp;lt;DataTemplate DataType=&amp;quot;Student&amp;quot;&amp;gt;            &#xD;
            &amp;lt;StackPanel Orientation=&amp;quot;Horizontal&amp;quot; &amp;gt;&#xD;
            &amp;lt;Grid Margin=&amp;quot;5&amp;quot;&amp;gt;                &#xD;
                &amp;lt;Rectangle Fill=&amp;quot;YellowGreen&amp;quot;  Width=&amp;quot;{Binding  XPath=@Score}&amp;quot;/&amp;gt;&#xD;
                &amp;lt;TextBlock  Text=&amp;quot;{Binding XPath=@Name}&amp;quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;&#xD;
            &amp;lt;/Grid&amp;gt;&#xD;
                &amp;lt;TextBlock Text=&amp;quot;{Binding XPath=@Score}&amp;quot; Margin=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;&#xD;
            &amp;lt;/StackPanel&amp;gt;&#xD;
        &amp;lt;/DataTemplate&amp;gt;&#xD;
        &amp;lt;XmlDataProvider x:Key=&amp;quot;xmlDp&amp;quot; XPath=&amp;quot;Students/Student&amp;quot;&amp;gt;&#xD;
            &amp;lt;x:XData&amp;gt;&#xD;
                &amp;lt;Students xmlns=&amp;quot;&amp;quot;&amp;gt;&#xD;
                    &amp;lt;Student Name=&amp;quot;Jack&amp;quot; Score=&amp;quot;80&amp;quot;&amp;gt;&amp;lt;/Student&amp;gt;&#xD;
                    &amp;lt;Student Name=&amp;quot;Tom&amp;quot; Score=&amp;quot;40&amp;quot;&amp;gt;&amp;lt;/Student&amp;gt;&#xD;
                    &amp;lt;Student Name=&amp;quot;David&amp;quot; Score=&amp;quot;75&amp;quot;&amp;gt;&amp;lt;/Student&amp;gt;&#xD;
                &amp;lt;/Students&amp;gt;&#xD;
            &amp;lt;/x:XData&amp;gt;&#xD;
        &amp;lt;/XmlDataProvider&amp;gt;&#xD;
    &amp;lt;/Window.Resources&amp;gt;&#xD;
    &amp;lt;StackPanel x:Name=&amp;quot;stackPanel&amp;quot;&amp;gt;&#xD;
        &amp;lt;ListBox ItemsSource=&amp;quot;{Binding Source={StaticResource xmlDp}}&amp;quot; FontSize=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;/ListBox&amp;gt;&#xD;
        &amp;lt;TextBlock Margin=&amp;quot;10&amp;quot;&amp;gt;Below is combox&amp;lt;/TextBlock&amp;gt;&#xD;
        &amp;lt;ComboBox ItemsSource=&amp;quot;{Binding Source={StaticResource xmlDp}}&amp;quot; FontSize=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;/ComboBox&amp;gt;&#xD;
    &amp;lt;/StackPanel&amp;gt;&#xD;
&amp;lt;/Window&amp;gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271114239451.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnblogsfans/201102/201102271114279371.png" width="426" height="277" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cnblogsfans/aggbug/1966172.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966172.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966170.html</id><title type="text">无废话WPF系列16：资源</title><summary type="text">在WPF中资源通常用作“样式”（Style）、样式模板、数据模板等。 一、资源的定义及使用 1. 应用程序级资源： 定义在App.xaml文件中，作为整个应用程序共享的资源 &amp;lt;Application x:Class=&amp;quot;DeepXAML.App&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot; xmlns:x=&amp;quot;ht...</summary><published>2011-02-27T03:13:00Z</published><updated>2011-02-27T03:13:00Z</updated><author><name>王德水</name><uri>http://www.cnblogs.com/cnblogsfans/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966170.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966170.html"/><content type="html">&lt;p&gt;在WPF中资源通常用作“样式”（Style）、样式模板、数据模板等。&lt;/p&gt;  &lt;p&gt;一、资源的定义及使用&lt;/p&gt;  &lt;p&gt;1. 应用程序级资源：&lt;/p&gt;  &lt;p&gt;定义在App.xaml文件中，作为整个应用程序共享的资源&lt;/p&gt;  &lt;pre &gt;&amp;lt;Application x:Class=&amp;quot;DeepXAML.App&amp;quot;&#xD;
             xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&#xD;
             xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&#xD;
             StartupUri=&amp;quot;MainWindow.xaml&amp;quot;&amp;gt;&#xD;
    &amp;lt;Application.Resources&amp;gt;&#xD;
        &amp;lt;SolidColorBrush Color=&amp;quot;Red&amp;quot; x:Key=&amp;quot;redBrush&amp;quot;&amp;gt;&amp;lt;/SolidColorBrush&amp;gt;&#xD;
    &amp;lt;/Application.Resources&amp;gt;&#xD;
&amp;lt;/Application&amp;gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;使用应用程序集资源&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&amp;lt;Window x:Class=&amp;quot;DeepXAML.MainWindow&amp;quot;&#xD;
        xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&#xD;
        xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&#xD;
        xmlns:local=&amp;quot;clr-namespace:DeepXAML&amp;quot;       &#xD;
        xmlns:sys=&amp;quot;clr-namespace:System;assembly=mscorlib&amp;quot;&#xD;
        Title=&amp;quot;MainWindow&amp;quot; Height=&amp;quot;250&amp;quot; Width=&amp;quot;450&amp;quot;&amp;gt;   &#xD;
    &amp;lt;StackPanel x:Name=&amp;quot;stackPanel&amp;quot;&amp;gt;&#xD;
        &amp;lt;Button Background=&amp;quot;{StaticResource ResourceKey=redBrush}&amp;quot;&amp;gt;test app resource&amp;lt;/Button&amp;gt;&#xD;
    &amp;lt;/StackPanel&amp;gt;&#xD;
&amp;lt;/Window&amp;gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;2. 窗体级资源：定义在Window或Page中，作为一个窗体或页面共享的资源存在 &lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&amp;lt;Window x:Class=&amp;quot;DeepXAML.MainWindow&amp;quot;&#xD;
        xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&#xD;
        xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&#xD;
        xmlns:local=&amp;quot;clr-namespace:DeepXAML&amp;quot;       &#xD;
        xmlns:sys=&amp;quot;clr-namespace:System;assembly=mscorlib&amp;quot;&#xD;
        Title=&amp;quot;MainWindow&amp;quot; Height=&amp;quot;250&amp;quot; Width=&amp;quot;450&amp;quot;&amp;gt;  &#xD;
    &amp;lt;Window.Resources&amp;gt;&#xD;
        &amp;lt;SolidColorBrush Color=&amp;quot;Red&amp;quot; x:Key=&amp;quot;redBrush&amp;quot;&amp;gt;&amp;lt;/SolidColorBrush&amp;gt;&#xD;
    &amp;lt;/Window.Resources&amp;gt;&#xD;
    &amp;lt;StackPanel x:Name=&amp;quot;stackPanel&amp;quot;&amp;gt;&#xD;
        &amp;lt;Button Background=&amp;quot;{StaticResource ResourceKey=redBrush}&amp;quot;&amp;gt;test app resource&amp;lt;/Button&amp;gt;&#xD;
    &amp;lt;/StackPanel&amp;gt;&#xD;
&amp;lt;/Window&amp;gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;3. 文件级资源：定义在资源字典的XAML文件中，再引用&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在Visual Studio的WPF应用程序项目中，添加“资源字典（Resource Dictionary）”类型的项&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&amp;lt;ResourceDictionary xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&#xD;
                    xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;&#xD;
    &amp;lt;SolidColorBrush Color=&amp;quot;Red&amp;quot; x:Key=&amp;quot;redBrush&amp;quot;&amp;gt;&amp;lt;/SolidColorBrush&amp;gt;&#xD;
&amp;lt;/ResourceDictionary&amp;gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;pre &gt;&amp;lt;Window x:Class=&amp;quot;DeepXAML.MainWindow&amp;quot;&#xD;
        xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&#xD;
        xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&#xD;
        xmlns:local=&amp;quot;clr-namespace:DeepXAML&amp;quot;       &#xD;
        xmlns:sys=&amp;quot;clr-namespace:System;assembly=mscorlib&amp;quot;&#xD;
        Title=&amp;quot;MainWindow&amp;quot; Height=&amp;quot;250&amp;quot; Width=&amp;quot;450&amp;quot;&amp;gt;  &#xD;
    &amp;lt;Window.Resources&amp;gt;&#xD;
        &amp;lt;ResourceDictionary Source=&amp;quot;Skin1.xaml&amp;quot;&amp;gt;&amp;lt;/ResourceDictionary&amp;gt;&#xD;
    &amp;lt;/Window.Resources&amp;gt;&#xD;
    &amp;lt;StackPanel x:Name=&amp;quot;stackPanel&amp;quot;&amp;gt;&#xD;
        &amp;lt;Button Background=&amp;quot;{StaticResource ResourceKey=redBrush}&amp;quot;&amp;gt;test app resource&amp;lt;/Button&amp;gt;&#xD;
    &amp;lt;/StackPanel&amp;gt;&#xD;
&amp;lt;/Window&amp;gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;font face="Courier New"&gt;4.对象（控件）级资源：定义在某个ContentControl中，作为其子容器、子控件共享的资源&lt;/font&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;pre &gt;&amp;lt;Window x:Class=&amp;quot;DeepXAML.MainWindow&amp;quot;&#xD;
        xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&#xD;
        xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&#xD;
        xmlns:local=&amp;quot;clr-namespace:DeepXAML&amp;quot;       &#xD;
        xmlns:sys=&amp;quot;clr-namespace:System;assembly=mscorlib&amp;quot;&#xD;
        Title=&amp;quot;MainWindow&amp;quot; Height=&amp;quot;250&amp;quot; Width=&amp;quot;450&amp;quot;&amp;gt;  &#xD;
     &amp;lt;StackPanel x:Name=&amp;quot;stackPanel&amp;quot;&amp;gt;&#xD;
        &amp;lt;StackPanel.Resources&amp;gt;&#xD;
            &amp;lt;ResourceDictionary Source=&amp;quot;Skin1.xaml&amp;quot;&amp;gt;&amp;lt;/ResourceDictionary&amp;gt;&#xD;
        &amp;lt;/StackPanel.Resources&amp;gt;&#xD;
        &amp;lt;Button Background=&amp;quot;{StaticResource ResourceKey=redBrush}&amp;quot;&amp;gt;test app resource&amp;lt;/Button&amp;gt;&#xD;
    &amp;lt;/StackPanel&amp;gt;&#xD;
&amp;lt;/Window&amp;gt;&#xD;
&#xD;
二、资源文件解析的顺序&lt;/pre&gt;&#xD;
&#xD;
&lt;pre &gt;这个顺序和层叠样式表类似，优先级从高到底为：对象级，窗体级，应用程序集。静态资源（StaticResource）和动态资源（DynamicResource）&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;资源可以作为静态资源或动态资源进行引用。这是通过使用 StaticResource 标记扩展或 DynamicResource 标记扩展完成的。 &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;通常来说，不需要在运行时更改的资源使用静态资源；而需要在运行时更改的资源使用动态资源。动态资源需要使用的系统开销大于静态资源的系统开销。 &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;三、静态资源（StaticResource）和动态资源（DynamicResource） &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;资源可以作为静态资源或动态资源进行引用。这是通过使用 StaticResource 标记扩展或 DynamicResource 标记扩展完成的。 &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;通常来说，不需要在运行时更改的资源使用静态资源；而需要在运行时更改的资源使用动态资源。动态资源需要使用的系统开销大于静态资源的系统开销。&lt;/p&gt;&#xD;
&#xD;
&lt;pre&gt;Background=&amp;quot;{DynamicResource redBrush}&amp;quot;&lt;/pre&gt;&#xD;
&#xD;
&lt;pre&gt;&amp;#160;&lt;/pre&gt;&#xD;
&#xD;
&lt;pre&gt;private void Button_Click(object sender, RoutedEventArgs e)&lt;/pre&gt;&#xD;
&#xD;
&lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
&lt;pre&gt;SolidColorBrush brush = new SolidColorBrush(Colors.Green);&lt;/pre&gt;&#xD;
&#xD;
&lt;pre&gt;this.Resources[&amp;quot;redBrush&amp;quot;] = brush;&lt;/pre&gt;&#xD;
&#xD;
&lt;pre&gt;}&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/cnblogsfans/aggbug/1966170.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnblogsfans/archive/2011/02/27/1966170.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
