Welcome

首页 / 软件开发 / Silverlight / 领先技术-在 WPF 和 Silverlight 2 中反复使用代码

领先技术-在 WPF 和 Silverlight 2 中反复使用代码2010-11-01 MSDN Dino Esposito本专栏基于 Silverlight 2 的预发布版本。文中的所有信息均有可能发生变更。

目录

WPF 与 Silverlight 2 的兼容性

视觉状态管理器简介

共享代码

有关 WPF 应用程序的推论

编写跨平台的 WPF 代码

分析托管代码

获取用于关键代码的策略

示例分析

最终注意事项

在 Silverlight 2 中,您可以使用可扩展应用程序标记语言 (XAML) 来设计和渲染用户界面。与此同时,您可以利用内置的核心 CLR 处理浏览器内的托管代码。这样基于 Web 的 Silverlight 2 应用程序与桌面 Windows Presentation Foundation (WPF) 应用程序就变得极为相似。编程模型相似的好处之一是可以在二者之间轻松重用代码。在本专栏中,我将介绍几种模式,它们能在 Silverlight 2 和 WPF 之间最为轻松地共享代码和 XAML 标记。

Silverlight 中的 CoreCLR

Silverlight 2 确实包含一个 CLR,但并不是其他 .NET 应用程序和程序集使用的 CLR。Silverlight CLR 也称为 CoreCLR,在设计时充分考虑了不同用途。CoreCLR 专为跨平台互操作性而设计,可与 CLR 同时运行并支持不同的安全模型以及不同版本的基础类库。2008 年 8 月的出色专栏《CLR 全面透彻解析》中对此进行了详细说明(请参阅 msdn.microsoft.com/magazine/cc721609)。

Silverlight 和 .NET 应用程序使用不同 CLR 意味着您不能在两个针对 .NET 应用程序和 Silverlight 应用程序的项目中引用同一个程序集。主要问题出在 mscorlib 程序集上。Silverlight 正常使用所需的功能集非常小-仅仅是内核。但任何 .NET 程序集都要链接标准版本的 mscorlib,这就是问题所在。

在本专栏所讨论的示例应用程序中,我利用一个接口来共享 Windows Presentation Foundation 应用程序与 Silverlight 应用程序。唯一的解决方法是在两项目之间复制 C# 及接口定义,因为您没有共同引用的程序集,因此在 .NET Framework 版本中,有必要将标准 mscorlib 程序集内的功能分成两部分:内核事务和桌面事务,以便为 Silverlight 和 .NET 程序集之间的二进制兼容性奠定基础。

WPF 与 Silverlight 2 的兼容性

继引入 Silverlight 2 后,XAML 不动声色地成为新一代的 UI 模块的 API。Silverlight 2 支持完整 WPF 框架的子集,其中包括丰富布局管理、数据绑定、样式、媒体、动画、图形和模板功能。

但在 Silverlight 2 内完全支持 XAML 受可下载插件的大小限制。在只有几兆的空间内(Beta 2 中不到 5MB),Silverlight 2 插件必须提供核心 CLR,即包括 WPF 和 Windows Communication Foundation (WCF) 客户端平台子集、XAML 分析器以及大量 Silverlight 特定控件的 Microsoft .NET Framework 3.5。

在 Silverlight 2 中不支持 WPF 3D 图形功能,其中的某些属性和元素也已被丢弃或裁减。综上所述,您已拥有可兼容的子集,因此您可以制作 Silverlight 版本的较为复杂的 WPF 用户界面。稍后,我将回头继续讨论兼容性的关键部分。

请注意,尽管 Microsoft 也在 Silverlight 中添加了某些新 API,但它们目前在桌面版本的 WPF 中并没有相对应的功能。最相关的功能包括控件(如 DataGrid)和类(如用于简单的 GET 样式网络调用的 WebClient)。这些功能也将被添加到 WPF 中。

视觉状态管理器简介

WPF 中还将添加 Silverlight 2 附带的另一个极为出色的功能 – 用于控件的视觉状态管理器 (VSM)。VSM 通过引入视觉状态和状态转换简化了交互控制模板的开发。由于 WPF 的引入,开发人员可通过模板和样式自定义 WPF 控件的外观和行为。例如,你不能只更改某个控件的形状和外观,还应该定义该控件在点击、得到或失去焦点等事件时的新行为或动画。

使用 VSM,视觉状态和状态转换将替您完成其中的部分工作。典型的 VSM 视觉状态有普通、鼠标悬停、禁用和获得焦点。您可以为这些状态每种定义一个样式或形状。状态转换用于定义控件如何从一种状态转换到另一种可视状态。通常可通过动画定义转换。在运行时,Silverlight 将播放相应的动画并应用指定的样式流畅地将控件从一个状态转换到另一个状态。

要定义视觉状态,在控件模板中插入标记片段,如下所示:

<vsm:VisualStateManager.VisualStateGroups>
<vsm:VisualStateGroup x:Name="CommonStates">
<vsm:VisualState x:Name="MouseOver">
<Storyboard>
...
</Storyboard>
</vsm:VisualState>
</vsm:VisualStateGroup>
</vsm:VisualStateManager.VisualStateGroups>

每个控件都定义一组或多组状态,如 CommonStates 和 FocusStates。而每组都定义具体的视觉状态,如“MouseOver”、“Pressed”和“Checked”。对于每种视觉状态和状态之间的转换,您可以定义一个 Silverlight 可在适当时候自动播放的故事板。

简言之,WPF 中有很多 Silverlight 2 不支持的功能,而 Silverlight 2 中的很多功能 WPF 也不具备。很大程度上是这些差异影响了 XAML 级别的兼容性。您可以使用公共子集实现完全兼容,并且令人欣慰的是,它足以保证您能执行几乎所有的操作。