XAML平台和跨平台开发策略
本文基于Vicky&James 2024年10月22日在韩国Microsoft总部BMW meetup会议上的演讲内容重新整理而成。这次研讨会我们深入探讨了基于XAML的各种平台、跨平台战略以及为有效的项目架构设计所需的核心技术。
介绍
大家好,我们中韩Microsoft MVP夫妇Vicky&James。我们从WPF开始就对包括Uno Platform在内的基于XAML的框架和项目架构设计有着深入的兴趣和经验。大家可以在我们的GitHub仓库中查看和下载各种项目的源代码:GitHub - jamesnetgroup
目录
- XAML平台和跨平台概述
- 考虑跨平台的.NET版本选择策略
- View和ViewModel的连接策略分析
- 框架设计的必要功能及实现方案
- 在其他平台上有效使用WPF技术的核心策略
- 分布式项目管理的Bootstrapper设计方法论
- 在桌面跨平台中最大化利用WPF技术的策略
1. XAML平台和跨平台概述
XAML是一种用于以声明方式定义UI的标记语言,被用于多个平台。XAML具有由对象(即类)组成的层次结构,使开发人员能够以面向对象的方式设计和管理UI。由于这种结构,开发人员直接处理XAML是很自然的。
当WPF首次出现时,它强调了开发人员和设计师之间的协作,但实际上XAML领域通常也由开发人员负责。这是因为XAML不仅仅是简单的设计,而是形成了基于对象的层次结构,在复杂的自定义控件实现中也发挥着重要作用。这种面向开发人员的设计方法促使XAML不仅在WPF中,而且在随后出现的许多平台中都成为核心组件。
特别是,WPF对所有基于XAML的平台都产生了重大影响,并成为这些平台最重要的参考。
1.1 主要的XAML框架
- WPF: 用于Windows桌面应用程序开发的强大框架,提供丰富的UI和图形功能。
- Silverlight: 用于在web浏览器中运行的互联网应用程序的平台,目前已停止支持。它是WPF的轻量级版本,以插件方式运行。由于Web标准政策的变化,基于插件的Web平台消失,在Silverlight 2中引入了**VisualStateManager(VSM)**来弥补Trigger的缺点。
- Xamarin.Forms: 支持iOS、Android和Windows的移动应用开发平台。作为基于Mono的第一个基于XAML的跨平台,被Microsoft战略性收购并成为.NET Core的基础。
- UWP (Universal Windows Platform): 用于开发运行在Windows 10及以上版本的应用程序的平台。需要注册Microsoft Store,并有WinAPI使用限制等约束。支持与WPF相同的自定义控件设计。
- WinUI 3: Windows原生UI框架,是最新Windows应用开发的下一代UI平台。继承了UWP的所有优点,同时解决了其限制,并采纳了WPF的可扩展性。
- MAUI (.NET Multi-platform App UI): 从.NET 6开始引入的跨平台UI框架,可以在单一项目中开发移动和桌面应用。
- Uno Platform: 允许在各种平台上使用UWP和WinUI的API的框架,支持Web(WebAssembly)、移动和桌面。支持几乎所有平台,并提供与WPF相同的自定义控件设计。
- Avalonia UI: 允许在跨平台上使用WPF风格XAML的开源UI框架。支持与WPF相同的自定义控件设计,通过独特的技术扩展支持各种平台。
- OpenSilver: 为将旧的Silverlight迁移到OpenSilver而优化的开源平台。以与Silverlight几乎相同的方式运行,也为WPF开发人员提供熟悉的环境。
2. 考虑跨平台的.NET版本选择策略
在跨平台应用程序开发中,需要谨慎选择要使用的.NET版本。因为这将直接影响兼容性、功能性和目标平台支持。
2.1 .NET版本选项
- .NET Framework: 仅用于Windows,主要用于现有的WPF和WinForms应用程序。
- .NET Standard 2.0 / 2.1: 为提供各种.NET实现之间的兼容性而设计的标准。
- .NET (Core) 3.0及以上: 支持Windows、macOS、Linux的跨平台.NET实现,包含最新功能和性能改进。
2.2 选择标准和考虑因素
如果需要跨平台支持,应该选择.NET Core或最新的.NET。如果与现有.NET Framework库或包的兼容性很重要,那么则应该使用.NET Standard 2.0。如果想要最新功能和性能改进,就需要考虑.NET 5及以上版本。
此外,跨平台框架从.NET 5.0开始考虑兼容性,并且基于最新版本持续进行功能改进,因此建议大家选择最新的.NET版本。
战略建议:
- 将通用库编写为
.NET Standard 2.0以确保最大兼容性。 - 为每个平台创建项目并引用通用库。
- 如果可能,使用
.NET 6及以上版本以获得最新功能和性能改进。
3. View和ViewModel的连接策略分析
在MVVM(Model-View-ViewModel)模式中,View和ViewModel的连接是核心部分。连接方式的不同会导致使用MVVM的方式完全不同。因此,我们需要根据使用MVVM的目的来决定DataContext分配方式。
3.1 传统的DataContext直接分配方式
在代码后台创建ViewModel并直接分配给View的DataContext。
public MainWindow()
{
InitializeComponent();
DataContext = new MainViewModel();
}
优点:
- 实现简单直观
- 可以明确控制视图模型的创建时机
- 可以向构造函数传递所需参数
缺点:
- View和ViewModel之间产生强耦合
- 单元测试时难以模拟(Mock)ViewModel
- 难以利用依赖注入(DI)
- 需要直接指定DataContext分配时机,可能难以保持一致性
3.2 在XAML中创建ViewModel实例
在XAML中设置DataContext来实例化ViewModel。
<Window x:Class="MyApp.MainWindow"
xmlns:local="clr-namespace:MyApp.ViewModels">
<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<!-- Window content -->
</Window>
优点:
- XAML的智能感知支持可以减少绑定错误
- 可以在设计器中预览实际的数据绑定
- 明确表达View和ViewModel之间的关系
缺点:
- ViewModel创建时难以进行依赖注入
- 复杂的初始化逻辑或参数传递受限
- DataContext分配时机被强制化,降低了灵活性
3.3 ViewModel直接创建及依赖传递
在代码后台创建ViewModel直接创建及依赖传递时直接传递所需的依赖。
public MainWindow()
{
InitializeComponent();

最低0.47元/天 解锁文章
1340

被折叠的 条评论
为什么被折叠?



