转载自https://www.cnblogs.com/joetao/articles/2547344.html

 

wpf开发于winform之后,从技术发展的角度,wpf比winform先进是不容置疑的。我觉得wpf相比于winform有下面的一些较好的特性: 
解决window handle问题 
  
在windows gdi或winform开发中复杂的gui应用程序,会使用的大量的控件,如grid等。而每个控件或grid cell都是一个小窗口,会使用一个window handle,尽管控件厂商提供了很多优化办法,但还是会碰到out of memory或”error create window handle”,而导致程序退出。 
  
wpf彻底改变了控件显示的模式,控件不在使用窗口,也就不会占用window handle。理论上,如果一个wpf只有一个主窗口的话,wpf只会使用一个window handle(如果忽略用于dispatcher的隐藏窗口的话)。所以wpf gui程序不会出现window handle不够用的情况。 
多线程的处理 
  
在winform程序开发时,最头疼的一个问题就是,worker线程修改控件的属性而导致程序崩溃,而且这种非法操作并不是每次都失败。winform控件提供了invokerequired属性来判断当前线程是不是控件创建线程。问题是当控件树很深是,这个属性会比较慢。 
  
wpf开始设计的时候,就考虑到了多线程的问题。大部分的wpf类都继承于dispatcherobject。dispatcherobject实际就是对dispatcher的一个简单封装。dispatcher提供了类似invokerequired的方法(checkaccess)。这个方法只是比较线程的id,所以会很快。另外,dispatcher提供了优先队列,异步调用,timer等功能,简化了开发多线程gui程序。 
控件的composition 
  
在winform如果要实现一个有checkbox的下拉菜单,将不得不处理复杂的window消息。而通过wpf控件的content model和layout系统,wpf控件可以包括任何类型的控件,甚至.net clr对象。很多现代的控件厂商也提供了composition的控件,实现方法和wpf的content模型也比较相似。wpf开发团队应该借鉴了infragistics的很多想法。有了这个基础,开发新的wpf控件更加简单了。 
xaml 
  
个人觉得xaml应该是wpf中比较划时代的东东。通过xaml,我们可以用文本的方式描述复杂的object graph。这个想法在vb中就有了,不过xaml更简化,以便于使用工具来生成xaml。通过command,routing event等机制,界面设计人员和程序员有比较清楚的界限。 
     
dependency property 
  
在winform开发中,经常碰到的问题就是一个控件的值变了,其他控件也会跟着改变。解决办法,要不是通过写代码,要不是通过数据绑定,前者是界面和代码没法分开,后者还不够灵活。而wpf在这方面通过xaml可以简单的把相关的属性联系起来,通过extension可以实现复杂的绑定关系。 
     
总的来说,我觉得wpf应该是gui发展的一个延续,原来gui中复杂的东西,现在通过简单的文本就可以实现。 
  
主要参考资料与工具: 
windows presentation foundation unleashed by adam nathan 
msdn 
essential windows presentation foundation(*强烈推荐,回答了很多why的问题) 
windows wpf source code 
reflector