65.9K
CodeProject 正在变化。 阅读更多。
Home

来自 WPF 或 Silverlight:WinRT UI 框架是什么?

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.87/5 (12投票s)

2013 年 2 月 15 日

CPOL

8分钟阅读

viewsIcon

36681

本文旨在识别WPF和Windows RT的UI框架之间的差异。

引言

微软的“现代UI”范式,在Windows Phone中已有所介绍,其特点是扁平化、以内容为中心的设计,在Windows RT和Windows 8操作系统发布之际迎来了复兴。虽然不能说“现代UI”设计语言曾一度消失,但不可否认的是,由于新操作系统的发布,它获得了前所未有的关注度。YouTube或MySpace等知名网站应用了相关概念,显著地印证了“现代UI”语言日益增长的影响力。

鉴于WinRT(即Windows应用商店应用背后的技术)在确立“现代UI”作为一种公认设计语言方面不可否认的重要性,WinRT的UI API变得至关重要:开发Windows应用商店应用GUI的体验如何?我们能否应用与WPF相同的函数和概念?WinRT的UI API与Silverlight API有何关联?本文将逐步考察WPF、Silverlight以及WinRT UI框架之间的差异,以期最终了解这项新技术。请注意,我们将仅考虑与API相关的方面。说到API相关方面:我们这里讨论的是Windows RT API。但这对于本文的目标受众意味着什么?这意味着,我们可以从C#、VB、C++(结合XAML)以及JavaScript(结合HTML和CSS)中使用所讨论的功能。简而言之,无论您是Web开发者还是桌面应用程序程序员:WinRT API适用于所有人!

从WPF开发者的角度看Windows RT UI框架

XAML语法本身的变更:XML命名空间定义

XML命名空间定义的语法显著不同,这可能是WinRT XAML与WPF或Silverlight XAML最突出的区别之一。这是开发Windows应用商店应用时遇到的第一个特点。因此,我们首先考虑如何在WPF、Silverlight或Windows Phone中定义XMLNS:

xmlns:mns="clr-namespace:MyNamespace;assembly=MyAssembly"
在Windows RT之前,这样定义XMLNS是正确的:通过指定CLR命名空间以及在需要时指定程序集。然而,在Windows应用商店应用中,我们不基于CLR构建应用程序——因此,这种语法现在无效是合理的。取而代之的是,我们现在可以使用“using”前缀来引入运行时命名空间。此外,我们无需定义任何程序集名称,因为包含的程序集将自动确定(如下图所示此处)。从现在开始,有效的命名空间声明将如下所示:
xmlns:mns="using:MyNamespace"

XML命名空间解析的这种明显变化意味着,在Windows应用商店应用中,不可能在同一XAML作用域内映射来自不同程序集的相同命名空间名称。

SDK支持:Expression SDK

通常,Expression SDK提供的功能有助于UI和应用程序逻辑之间更严格的职责分离。设计师的任务是设计和实现令人印象深刻的“外观和感觉”:一方面,他/她可以使用Expression Blend(或新的Blend for Visual Studio 2012)中的控件模板和样式来定义合适“外观”。另一方面,我们可以考虑需要实际编码的“感觉”方面更复杂的其他要求。由于触发器(Triggers)和行为(Behaviors)(Expression SDK的一部分)有助于后端实现这种“感觉”并在设计端进行后续利用,因此我们认为这些概念在设计遵循类似MVVM等对设计师-开发者协作友好的模式的系统时至关重要。最重要的是,由于这些概念,Expression Blend和Expression SDK是设计师创建高保真原型的绝佳工具,这些原型可以部分迁移到实际产品中。

作为上述场景的强大工具,我们对未能找到WinRT兼容版本的Expression SDK感到有些失望。

幸运的是,我们在CodePlex上找到了两个值得仔细研究的项目。
  1. WinRtBehaviors 提供了一个自定义行为实现。
  2. WinRtTriggers 提供了一个类似于Expression SDK中包含的EventTrigger,以及一个GoToStateAction、一个InvokeCommandAction、一个ControlStoryboardAction以及所需的基类(即在实现自己的触发器或触发器操作时)和其他相关类。

为了完整起见,请注意,GitHub上还有一个针对Windows RT的Interactivity实现

值得注意的是,在撰写本文时,WinRT是微软UI框架(WPF、Silverlight、Windows Phone)当前生态系统中唯一不支持Expression SDK的平台。

触发器

与Silverlight类似,Microsoft未在WinRT API中采纳属性触发器和数据触发器的概念。请注意,正如在“SDK支持:Expression SDK”一节中提到的,可以通过利用自定义触发器实现来弥补这一差距。

数据绑定

WinRT API提供了一个明显缩减的绑定模式枚举:Windows应用商店应用不支持OneWayToSource或Default。考虑到以下XAML片段,后者缺失的影响显而易见:

 <!--WPF:
implicitely binds TwoWay -->
<TextBlock Text={Binding Source={StaticResource ViewModel), Path=Value}/>
<!-- WinRT:
implicitely binds OneWay -->
<TextBox Text={Binding Source={StaticResource ViewModel), Path=Value}/> 
由于TextBox通常代表用户输入的界面,因此其Text属性的绑定模式在WPF中默认为TwoWay。因此,如上定义的TextBlock将在每次相应的TextBoxText属性更改时更新其Text属性(因为它们都绑定到同一个变量)。

相比之下,在Windows应用商店应用中,由于缺少“Default”绑定模式,此类绑定声明在TextBoxText属性上将是单向的(隐式绑定模式为OneWay),因此不会触发对绑定视图模型变量的更新。尤其是在将WPF应用程序移植到WinRT时,此特性很容易出错,因为我们通过编写相同的代码却看到了不同的行为。因此,我们敦促所有计划将WPF应用程序移植到WinRT的开发者验证是否定义了显式的绑定模式声明。

此外,WinRT API也不支持Multi和Priority Bindings。

请注意,RT API中缺失的绑定模式枚举以及对Multi/Priority Bindings的支持与Silverlight/Windows Phone API类似。

命令

我们关于WinRT中命令的最终发现如下:

  1. 没有内置的ICommand接口实现。作为WPF中实现该接口的概念,路由命令(routed commands)的概念未被WinRT XAML框架采纳。因此,WPF的161个内置静态路由命令属性(在4.0版本中引入)也不包含在内。
  2. ICommandSource接口已不复存在。
  3. 唯一公开ICommand属性的类是ButtonBase。因此,InputBindings也未被WinRT框架采纳。
因此,Windows应用商店应用中的命令感觉更像Silverlight/Windows Phone 7.X,而不是WPF。请注意,上述陈述基于利用相应反射能力进行的检查

依赖属性

让我们简要回顾一下WPF如何计算依赖属性的值——要计算依赖属性的实际值,负责的引擎会依次执行以下步骤:
  1. 根据优先级规则确定基值。
  2. 求值(如果是表达式)。
  3. 应用动画。
  4. 强制转换。
  5. 验证

相比之下,WinRT框架缺少步骤(4)和(5),因此在这方面更像Silverlight和Windows Phone 7.X。

摘要

总而言之,我们已经成功识别了一系列区分Windows Presentation Foundation(WPF)和Windows RT Framework的特征。回顾我们的发现,我们可以揭示以下初步结果:
  1. XAML代码中不同的XML命名空间声明。
  2. 缺少Expression SDK。
  3. 缺少属性触发器/数据触发器。
  4. 缩减的BindingMode枚举。
  5. 缺少Multi/Priority Binding。
  6. 缺少路由命令。
  7. 缺少InputBindings。
  8. 依赖属性的值计算不包括强制转换和验证。

基于这些发现,我们可以确定WinRT UI框架更多地受到Silverlight的指导,而不是WPF。回顾 respective frameworks的目标平台,这种关联似乎很合理:WinRT和Silverlight应用程序都以提供有限资源的沙盒环境为目标,而WPF则不受这些限制,因此能够实现额外的功能。

此外,我们应该意识到,微软不仅仅是定制了一个现有框架——相反,他们创建了一个全新的平台,为许多流行的编程语言提供了与Silverlight几乎相同的功能。特别是通过包含JavaScript/HTML的接口,微软明确地针对了那些不一定之前关注微软生态系统的应用开发者。

深入阅读

© . All rights reserved.