我们正在讨论我们未来的Windows UI开发应该是WinForms还是WPF.你们有些人做出这个决定了吗?我们的大多数应用程序都是LOB应用程序,我不确定WPF对这些类型的应用程序有什么明显的压倒性优势.但是,我对WPF的了解有限.我也有点担心WPF将在未来几年流行,然后微软会厌倦它并推动其他东西.我想有一个论点是Visual Studio 2010是一个WPF应用程序.
谢谢.
这里有很多因素需要考虑.
不选择WPF的原因:
它目前对常见LOB控件(如日期选择器,数字输入窗口小部件等)的支持少于WinForms,尽管这通过WPF工具包,WPF 4和第三方控件供应商得到了改进.
该工具不适合亲吻Windows窗体设计师的靴子.(虽然公平地说,这部分是因为工具必须应对更复杂的方法来构建视图.而且Blend肯定会到达那里.)
与Windows窗体非常不同的心理模型.要从WPF中获得真正的好处,您需要以一种与您习惯的方式完全不同的方式进行思考.因此,可能存在一个实质性的学习曲线 - 不仅仅是学习技术,而是内化习语和模式(尽管现在围绕惯用WPF的社区资源比以前多得多).
选择WPF的原因:
体面的建筑支持.WPF(如果你做对了)内置了很好的代码和UI分离,使WPF应用程序更容易测试和发展.
更大的灵活性 例如,如果您需要一个简单的地图显示,您可以在几个小时内从ListBox构建它,而不必从头开始研究和购买第三方组件或编写地图控件.简单的数据可视化是WPF的一个杀手级功能.
WinForms是一个死胡同.它不会看到微软的任何增强功能,并且随着WinForms市场的饱和,控制厂商已经开始转向WPF.
您的大部分WPF体验都可以移植到Silverlight,这可以让您灵活地将应用程序带到浏览器和手机上,并且(b)让您更有信心微软不会失去兴趣 - 即使他们这样做对WPF感到"厌倦",他们对Silverlight表现出非常强烈的承诺.
就个人而言,如果我现在开始使用Windows桌面应用程序,我会选择WPF.但是,我已经爬上了学习曲线.对于没有WPF经验的团队来说,接受它的成本必须是比我更大的因素.
要记住的一件事是Silverlight.是否有可能您希望将应用程序编写为将来从浏览器运行,甚至可能从Windows Phone 7设备运行?虽然Silverlight和WPF并不完全相同,但它们非常相似.这将是我支持WPF的主要"面向未来"的论点.
我个人喜欢WPF的组合模型 - 以及表示UI的声明方式,以及比WinForms更好的布局系统.并不是说我是一个UI人,真的.
WPF对我来说是一个改变游戏规则的人.我公司的旗舰应用程序是一个WinForms程序,其UI在运行时从元数据动态构建.总而言之,大约需要六个月的努力才能让用户界面保持稳定,更不用说有吸引力了.还有一些我无法解决的错误,主要是因为UI代码无可救药地且不可避免地与数据模型代码交织在一起.并且不要让我开始使用窗口把手.
现在该系统已投入生产一年左右,客户向我提出的请求是"我们希望能够通过拖放重新排序此屏幕上的信息",并且"我们能否获得此信息在这个标签的这一部分显示在网格中?" 而且 - 我的最爱 - "我们可以获得拼写检查和自动文字吗?" 这些请求进入了一个非常长的积压.
我花了相当多的时间来弄清楚如何重构应用程序的设计,以便它可以支持WPF UI.(实际上,这是一个相当轻描淡写的事情.我一直在努力解决这个问题一年半的事情,一旦我打破了我工作的WPF书籍并学习了MVVM,我才开始关注它.)一旦我做了,结果是惊人的.
代码更简单.调试的逻辑要少得多.UI中的所有内容都要快得多,这很重要,因为这首先是桌面应用程序的全部原因是我们需要一个响应非常快的UI.我的程序可以创建数以千计的UI控件而无需担心窗口句柄.我能够轻松改变程序的外观和感觉令人惊讶.
(一个例子:UI提供DataRow
了各种各样的模板.由于给定的屏幕上可以有几十行,而且光标很小,所以用户能够一目了然地说明什么是有用的.光标所在的行.我花了十分钟来实现这些样式,这些样式现在可以在我的应用程序中随处可用.这比我想要将它添加到我的WinForms应用程序时估计该功能的时间要少.当然,如果不能通过添加两种样式来完成它会花费更长的时间.WPF严重不是魔术.)
有缺点吗?佩林女士喜欢说,你打赌.浏览我在SO上提出的一些问题 - 关于无操作值转换器如何改变数据绑定行为的问题是一个很好的问题.整个调试绑定的整个方法是非常令人沮丧的,特别是因为它很容易出现绑定错误,甚至不知道它.(我现在始终将我的输出窗口保留在屏幕上,这样如果我在测试时有任何绑定错误,那么记录的消息的移动将引起我的注意.)能够得到它会很好当你的窗口抛出一个真正的堆栈跟踪XamlParseException
.不要让我说话,我可以整晚说话.
和工具!Visual Studio用于构建WPF UI的可视化工具对我来说完全没用.我有混合,并用它来重新模板控件,但总的来说,我发现使用Blend就像试图通过充满轮毂盖和打包线的沼泽慢跑.如果你所知道的是Blend,我确定它真的很棒,但如果你首先学到的是WPF对象模型和XAML,那么Blend的行为是非常神秘的.Visual Studio和Kaxaml中的XML编辑器让我感到难过,而Resharper的WPF功能就是说,正在进行中.我非常喜欢WinForms的工具,这些工具使我能够顺利快速地构建缓慢,古怪且不可维护的乌鸦代码嵌套,这些代码我不得不厌恶.