从WPF迁移到Silverlight:主要差异是什么?

时间:2010-11-05 14:05:51

标签: wpf silverlight mvvm silverlight-4.0

我使用WPF做了一个完整的项目,并且(至少)很好地掌握了主要概念,比如XAML,Databinding和MVVM。我们“手工”完成了所有工作 - 我们没有使用MVVM框架或第三方工具。所有XAML都是手工编写的(没有Blend)。

我将在几周内开始的新项目是相当重型的Silverlight,我希望尽快加快速度。然而,我在阅读SL时开始阅读的大部分文章都集中在XAML和数据绑定上。由于我对这些概念的介绍在我的记忆中仍然非常新鲜,我当然可以理解为什么这些教程会花费大量时间在这些主题上 - 学习曲线可能非常陡峭。然而,这些是我已经熟悉的概念,并且发现自己不得不涉足许多新的领域并学习任何新的东西。

因此,我正在寻找的是关于我需要学习和理解的建议,从成为一名熟练的WPF'er到熟练的Silverlight'er。这可以是以下形式:

  • 一般建议
  • 主要差异
  • 经验法则
  • 资源/链接(“WPFer指南” Silverlight“将是完美的:)
  • 主要陷阱/需要注意的事项

提前感谢任何见解。

2 个答案:

答案 0 :(得分:9)

Rob Eisenberg(CaliburnCaliburn Micro的创建者)有一系列博客文章,讨论如何将WPF应用程序移植到Silverlight。这可以让您深入了解一些框架差异。

第1天 http://devlicio.us/blogs/rob_eisenberg/archive/2010/03/25/porting-nhprof-from-wpf-to-silverlight-day-1.aspx

第2天http://devlicio.us/blogs/rob_eisenberg/archive/2010/03/29/porting-nhprof-from-wpf-to-silverlight-day-2.aspx

第3天http://devlicio.us/blogs/rob_eisenberg/archive/2010/03/31/porting-nhprof-from-wpf-to-silverlight-day-3.aspx

第4天http://devlicio.us/blogs/rob_eisenberg/archive/2010/04/01/porting-nhprof-from-wpf-to-silverlight-day-4.aspx

第5天http://devlicio.us/blogs/rob_eisenberg/archive/2010/04/02/porting-nhprof-from-wpf-to-silverlight-day-5.aspx

第6天http://devlicio.us/blogs/rob_eisenberg/archive/2010/04/02/porting-nhprof-from-wpf-to-silverlight-day-6.aspx

第7天http://devlicio.us/blogs/rob_eisenberg/archive/2010/04/02/porting-nhprof-from-wpf-to-silverlight-day-7.aspx

第8天http://devlicio.us/blogs/rob_eisenberg/archive/2010/04/02/porting-nhprof-from-wpf-to-silverlight-day-8.aspx

其他一些想法:

  • 绑定默认为单向
  • 没有DynamicResource
  • TabControl是完全不同的
  • 无法为类型
  • 定义隐式DataTemplates
  • 依赖属性中没有CoerceValue
  • 事件路由非常基本
  • 没有内置命令结构。你有ICommand接口,而ButtonBase控件有一个Command属性,虽然没有实现ICommand接口的类。
  • 缺少x:静态,x:输入
  • 所有服务调用都需要位于与UI线程不同的线程上。这基本上要求您学习/实现异步编程策略。请参阅herehere
  • 如前所述,它是一个不同的框架,因此并非所有库都可供您使用。示例:没有XmlDocument - 您必须使用XElement(这可以说是更好,尽管如此)
  • 导航框架与WPF完全不同。远离它。它只会让你痛苦。 ]
  • 您可以在Silverlight Toolkit中找到的WPF核心框架中找到的几个控件。下载它,你需要它。
  • 没有内置触发器,但可以使用Blend SDK中提供的行为/操作(基本上可以为您提供相同的功能)
  • 如果您需要与数据库进行交互,则必须通过某处托管的服务,或通过COM(这意味着具有提升权限的Silverlight 4 OOB)。
  • 我不同意Kevin,因为测试实际上非常简单,所有主要的测试框架和模拟框架都支持Silverlight。遇到问题的是代码覆盖率。 Microsoft测试框架支持代码覆盖率(Premium&以上),否则您可以使用dotCover。我相信较新版本的nCover支持Silverlight,虽然我不是100%肯定。使用StatLight从命令行运行Silverlight测试(无论测试框架如何)。
  • 如果您还没有使用IoC容器,请选择一个。 Autofac,Ninject,StructureMap,Unity,MEF。 (我的另一个偏见;])

我强烈建议调查可用的MVVM框架。这减少了我通常必须编写的框架代码的很大一部分。框架可能只会让你获得你所需要的80%,尽管80%你不需要自己写。我现在偏爱Caliburn Micro,虽然大多数受欢迎的会给你你所需要的。

如果我想到更多,我会添加更多。祝你旅途中好运!

答案 1 :(得分:2)

我真的只为一个真正的应用程序完成了Silverlight ...但我的一个同事是一个伟大的WPF人,所以我听到他的一些抱怨。

  • 您可能需要使用WCF服务等来对服务/业务层进行异步查询
  • 您正在使用.NET框架的一个子集,因此您不能将任何类库作为参考包含在内,只能包含Silverlight类库。但是,您可以在Silverlight库中执行“链接到现有文件”之类的操作,该文件链接到其他库中的文件...只要代码仍然只使用简化集编译。这是一个维护噩梦,但如果你正在做WPF& Silverlight与一些相同的代码,它可能会为您节省大量的复制。确保将其作为文件的链接而不是文件的副本,或者更改其中一个不会改变另一个。
  • 对ViewModel进行单元测试并不容易。需要Moq您的服务并使用Silverlight单元测试项目。
  • 一些减少的功能对WPF老手来说很烦人。
  • 我认为我们的WPF家伙抱怨无法像在CanFecute方法中那样轻松地绑定他的命令,就像他在WPF中所做的那样。他必须直接从命令或其他东西调用该方法。 (到目前为止,我现在只有一个不同的项目,我才有机会看一下MVVM :(对那个项目不太确定)。

希望有所帮助。