2010-11-05 33 views
11

我已经完成了一个使用WPF的完整项目,并且对XAML,Databinding和MVVM等主要概念有了(至少)很好的把握。我们“手工”做了所有事情 - 我们没有使用MVVM框架或第三方工具。所有的XAML都是手写的(没有Blend)。从WPF转到Silverlight:关键区别是什么?

我将在几周内开始的新项目是相当繁重的Silverlight,我希望尽快赶上速度。然而,我读过的大多数关于SL入门的文章都集中在XAML和数据绑定上。由于我对这些概念的介绍在我的记忆中仍然很新,我当然可以理解为什么这些教程会在这些主题上花费大量时间 - 学习曲线可能非常陡峭。然而,这些都是我已经熟悉的概念,并且发现自己必须通过大量的覆盖面来学习新的东西并引人注目。

所以我正在寻找的是我需要学习和理解的一些建议,从做一个熟练的WPFerer到一个熟练的Silverlight'er。这可以在形式:

  • 一般建议
  • 主要区别拇指
  • 规则
  • 资源/链接( “A WPFer指南 Silverlight的” 将是完美的:)
  • 主要陷阱/注意事项

在此先感谢您的任何见解。

回答

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

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

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

第六天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的是相当不同
  • 无法定义隐式DataTemplate S代表类型
  • 在依赖属性没有CoerceValue
  • 事件路由是很基本
  • 没有内置的命令结构。你有ICommand接口,并且ButtonBase控件有一个Command属性,虽然没有实现ICommand接口的类。
  • 缺少x:Static,x:类型
  • 所有服务调用都需要位于与UI线程不同的线程上。这基本上要求您学习/实现异步编程策略。请参阅herehere
  • 如上所述,它是一个不同的框架,因此并非所有库都可供您使用。示例:没有XmlDocument - 您必须使用XElement(尽管如此,这可以说更好)
  • 导航框架与WPF完全不同。远离它。这只会让你痛苦。 ;]
  • 您在WPF的核心框架中找到的几个控件可以在Silverlight Toolkit中找到。下载它,你需要它。
  • 没有内置触发器,但可以使用Blend SDK中提供的行为/动作(基本上可以为您提供相同的事情)
  • 如果您需要与数据库进行交互,它必须通过托管在某处的服务或者通过COM(这意味着Silverlight 4 OOB具有提升的权限)。
  • 我不同意凯文的看法,那就是测试其实很简单,所有主要的测试框架和模拟框架都支持Silverlight。您遇到的问题是Code Coverage。 Microsoft测试框架支持代码覆盖(上面的高级&),否则您可以使用dotCover。我相信nCover的新版本支持Silverlight,尽管我不是100%确定的。使用StatLight从命令行运行Silverlight测试(无论测试框架如何)。
  • 如果您尚未使用IoC容器,请选择一个容器。 Autofac,Ninject,StructureMap,Unity,MEF。(我的另一个偏见;))

我会强烈建议寻找可用的MVVM框架。这减少了我通常必须编写的框架代码的很大一部分。这些框架可能只会让你获得80%的所需,不过这80%你不必自己写。我目前偏爱Caliburn Micro,虽然大多数流行的会给你你需要的。

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

+0

我很困惑“所有的服务调用需要在不同于UI线程的线程上。” - 我的理解是,所有的调用都必须是异步的,因为它们*可以在UI线程上。 – Gabe 2010-11-06 06:52:34

+0

嘿Gabe,这里是Silverlight WCF团队开发人员Tomasz Janczuk的一句话(现在连接上面的答案)。 “Silverlight应用程序中的WCF代理使用启动Web服务调用的线程的SynchronizationContext来调度接收到响应时调用异步事件处理程序的情况。当Web服务调用是从Silverlight的UI线程应用程序,异步事件处理程序代码也将在UI线程上执行。“所以WCF会将你的调用回调到UI线程。但是,您不允许拥有阻止服务。 – 2010-11-06 07:10:25

2

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

  • 你将可能需要使用WCF服务等,为异步查询到您的服务/业务层
  • 您使用的是.NET框架的一个子集,所以你不能包括作为参考的任何类库都可以包含Silverlight类库。但是,只要代码仍然只编译缩减集,您就可以执行诸如链接到其他库中的文件的Silverlight库中的'链接到现有文件'之类的东西。这是一个维护噩梦,但如果你正在使用一些相同的代码的Silverlight WPF &,它可能会节省你从很多复制。确保将其作为文件的链接而不是文件的副本,否则更改不会改变其他文件。
  • 单元测试你的ViewModels不会那么容易。需要Moq服务并使用Silverlight单元测试项目。
  • 一些简化的功能令WPF老兵很烦。
  • 我认为我们的WPF家伙抱怨说他不能像CanExecute方法那样容易地在他的命令中绑定像WPF一样的东西。他不得不直接从命令或其他东西中调用该方法。 (我只得到一个机会在MVVM一点看,只要我现在在不同的项目:(,所以没有一个很确定)。

希望帮助一点点。