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


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

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

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

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

提前感谢您的任何见解。


8441
2017-11-05 14:05


起源



答案:


Rob Eisenberg(创作者) 卡利 和 Caliburn 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线程不同的线程上。这基本上要求您学习/实现异步编程策略。看到 这里 和 这里
  • 如前所述,它是一个不同的框架,因此并非所有库都可供您使用。示例:没有XmlDocument - 您必须使用XElement(这可以说更好,尽管如此)
  • 导航框架与WPF完全不同。远离它。它只会让你痛苦。 ]
  • 你可以在WPF的核心框架中找到的几个控件 Silverlight工具包。下载它,你需要它。
  • 没有内置触发器,但可以使用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,尽管大多数受欢迎的产品都能满足您的需求。

如果我想到更多,我会添加更多。祝你旅途愉快!


9
2017-11-06 06:36



我对“所有服务调用需要与UI线程不同的线程感到困惑。” - 我的理解是所有的呼叫都必须是异步的,因为它们 能够 在UI线程上。 - Gabe
嘿Gabe,这是来自Silverlight WCF团队的开发人员Tomasz Janczuk的引用(现在链接在上面回答)。 “Silverlight应用程序中的WCF代理使用启动Web服务调用的线程的SynchronizationContext来调度接收响应时异步事件处理程序的调用。当从Silverlight应用程序的UI线程启动Web服务调用时,异步事件处理程序代码也将在UI线程上执行。“因此,WCF将为您调用回调到UI线程的调用。但是,您不允许使用阻止服务。 - Joe McBride


答案:


Rob Eisenberg(创作者) 卡利 和 Caliburn 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线程不同的线程上。这基本上要求您学习/实现异步编程策略。看到 这里 和 这里
  • 如前所述,它是一个不同的框架,因此并非所有库都可供您使用。示例:没有XmlDocument - 您必须使用XElement(这可以说更好,尽管如此)
  • 导航框架与WPF完全不同。远离它。它只会让你痛苦。 ]
  • 你可以在WPF的核心框架中找到的几个控件 Silverlight工具包。下载它,你需要它。
  • 没有内置触发器,但可以使用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,尽管大多数受欢迎的产品都能满足您的需求。

如果我想到更多,我会添加更多。祝你旅途愉快!


9
2017-11-06 06:36



我对“所有服务调用需要与UI线程不同的线程感到困惑。” - 我的理解是所有的呼叫都必须是异步的,因为它们 能够 在UI线程上。 - Gabe
嘿Gabe,这是来自Silverlight WCF团队的开发人员Tomasz Janczuk的引用(现在链接在上面回答)。 “Silverlight应用程序中的WCF代理使用启动Web服务调用的线程的SynchronizationContext来调度接收响应时异步事件处理程序的调用。当从Silverlight应用程序的UI线程启动Web服务调用时,异步事件处理程序代码也将在UI线程上执行。“因此,WCF将为您调用回调到UI线程的调用。但是,您不允许使用阻止服务。 - Joe McBride


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

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

希望有所帮助。


2
2017-11-05 14:25