WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战

news/2025/2/27 1:14:45/文章来源:https://www.cnblogs.com/vickyqu115/p/18740110

开源项目名称:leagueoflegends-OpenSilver
作者:Vicky&James
leagueoflegends-opensilver:https://github.com/jamesnetgroup/leagueoflegends-opensilver
leagueoflegends-wpf:https://github.com/jamesnetgroup/leagueoflegends-wpf
Jamesnet个人网站:https://jamesnet.dev

  • 网站链接
  • GitHub链接


*请多多点亮Star和Fork以表鼓励,大家的支持是我们持续开源的动力!😊

目录

  1. 引言
    1. 项目概述:英雄联盟系列
    2. OpenSilver 的迁移能力
    3. 继承 WPF 开发方法的用户体验
    4. 原生网页集成方案
  2. 架构
    1. OpenSilver 项目结构
    2. 基于 CustomControl 的开发
    3. 项目去中心化与模式
    4. 跨平台架构
  3. 跨平台响应式架构策略
    1. IValueConverter 的使用
    2. VisualStateManager 的集成
    3. ICommand 与 CustomControl 的交互
    4. 跨平台依赖注入策略
  4. 结论

1. 引言

本文探讨了使用 XAML 实现英雄联盟客户端并成功迁移至 OpenSilver 的案例研究。该项目通过 GitHub 仓库 和 Azure Web App 网站 公开发布,重点展示了 OpenSilver 的技术特点——一个将 XAML 技术扩展到网页环境的平台,基于传统以桌面为中心的 WPF 体验构建。英雄联盟在 WPF 中已建立了模块化架构,而 OpenSilver 则为这一架构无缝迁移到 WebAssembly 执行提供了基础。

1. 项目概述:英雄联盟系列

在过去五年中,英雄联盟项目通过从 WPF 迁移到包括 Uno PlatformUWPWinUI 3 在内的各个桌面 XAML 平台,不断发展其基于 .NET Standard 2.0 的单一框架架构。这一次,它通过 OpenSilver 将 XAML 技术扩展到网页上,为桌面体验向网页环境的过渡提供了新可能。迁移自 WPF 的逻辑和 UI 作为一个类库直接在 OpenSilver 中得到利用。

GitHub: https://github.com/jamesnetgroup/leagueoflegends-opensilver

2. OpenSilver 的迁移能力

OpenSilver 提供了全球公认的强大迁移能力,其基于在 Silverlight 和 WPF 应用迁移方面的丰富全球经验和专业知识。众多公司和开发者已成功将现有的 WPF 与 Silverlight 应用迁移至 WebAssembly 环境,进一步巩固了其在全球市场的地位。英雄联盟项目利用了这一世界级技术,将其基于 CustomControl 的架构——原本在 WPF 中开发——迁移至类库,并进一步扩展到网页上,从而实现高效的迁移,无需复杂的代码修改

3. 继承 WPF 开发方法的用户体验

OpenSilver 保持与 WPF 相同的架构和开发模式(例如 CustomControl、依赖注入、项目去中心化)。这使得 WPF 开发者无需额外学习即可在熟悉的环境中工作,确保一致的用户体验和高度兼容性。英雄联盟项目自然地将 WPF 中设计的模块化结构迁移至 OpenSilver,在网页上保持同样的高质量表现。

4. 原生网页集成方案

JavaScript、CSS、路由和 URL 管理等原生技术在网页开发中至关重要。OpenSilver 背后的公司 Userware 同时开发了 CSHTML5(将 XAML 转换为 HTML)和 XAML for Blazor(使 XAML 可在 Blazor 中使用),展示了他们在将 XAML 与原生网页技术集成方面的深厚专业知识。基于这一经验,OpenSilver 将 JavaScript 与 CSS 等原生网页功能与传统的 WPF 开发方法相融合,在保留 XAML 优势的同时,最大化了网页固有的功能与性能。在将 WPF 中基于 CustomControl 的模块迁移到 OpenSilver 后,英雄联盟项目利用 OpenSilver 的原生网页集成技术,在 WebAssembly 环境中提供了优化的用户体验

2. 架构

OpenSilver 将 WPF 的技术特性扩展到网页上,提供了满足现代网页开发需求的架构。本节探讨了 OpenSilver 项目的结构以及英雄联盟项目基于 CustomControl 的开发方式。英雄联盟已在 WPF 中建立了跨平台设计的架构,而 OpenSilver 则为这一架构扩展到网页环境提供了框架支持。

1. OpenSilver 项目结构

OpenSilver 是一个主要为 WebAssembly 执行设计的统一平台,同时也支持通过 WPF 在 Windows 上进行测试执行以便开发。英雄联盟项目最初基于 WPF 中的模块化结构构建,而 OpenSilver 提供了一个将 WebAssembly 与 Windows 测试执行良好分离的架构,使得 WPF 项目可以直接迁移并运行。这使得在 WPF 中构建的逻辑与 UI 能够迁移到类库,并自然扩展至 OpenSilver。

项目组件

  • Leagueoflegends:主项目,涵盖基于 XAML 的 UI 和核心业务逻辑。基于从 WPF 迁移到类库的逻辑,并为 OpenSilver 的 WebAssembly 执行进行了优化。
  • Leagueoflegends.Browser:通过将 OpenSilver 代码转换为 WebAssembly 格式进行部署,提供网页执行环境,在将 WPF 设计结构扩展到网页上方面起到了关键作用。
  • Leagueoflegends.Simulator:基于 WPF 的模拟器,支持测试和调试工具(如设计器、实时预览),允许在 OpenSilver 内保持与 WPF 相同的开发方式。

这一结构保留了 WPF 的开发方法,同时实现了向 WebAssembly 执行的扩展,有效整合了迁移到类库中的 WPF 逻辑在 OpenSilver 中的应用。英雄联盟项目利用这一架构自然地将其模块化设计迁移到网页环境中。

2. 基于 CustomControl 的开发

英雄联盟项目从一开始就在 WPF 中采用了所有 UI 元素均以 CustomControl 实现的结构。该方法提供了重用性和样式灵活性,为跨平台迁移奠定了基础。

由于 OpenSilver 提供了与 WPF 相同的 CustomControl 支持,现有设计可以在扩展到网页环境时保持不变。这一设计允许在 WPF 中已优化的模块化架构迁移到类库,并以 WebAssembly 的形式在 OpenSilver 中执行。

优势

CustomControl 通过统一的模板和样式定义提供了模块化的 UI,不仅便于样式和自定义,而且提升了代码的可读性和可维护性。英雄联盟项目在 WPF 中采用这一方法设计了独立组件,并在 OpenSilver 中应用相同模式,以在迁移过程中最大程度地减少代码修改。

与传统的 UserControl 不同,CustomControl 通过将 UI 元素拆分为独立模块来降低复杂依赖性。例如,UserControl 需要使用 x:Key 单独定义样式,从而增加了详细设置的复杂性并降低了重用性。

相比之下,CustomControl 将按钮或卡片等独立组件封装为具备自身逻辑和样式的单元,提高了重用性。这使得从 WPF 到 OpenSilver 的无缝集成成为可能,且在一致模式下工作能减少维护和扩展过程中出现的错误。

上图直观地展示了 CustomControl 结构的优势。在将英雄联盟项目从 WPF 设计迁移至 OpenSilver 时,这一结构非常有利,使得迁移到类库的逻辑能在 WebAssembly 环境中高效运行。

迁移效率

CustomControl 简单清晰的结构相比 UserControl 降低了兼容性问题,并在必要时支持快速修改。英雄联盟项目在 WPF 中采用这种结构为跨平台设计做好了准备,而 OpenSilver 原生支持这一结构,使得从 WPF 到网页的过渡更为高效。迁移到类库的 WPF 逻辑在 OpenSilver 的 WebAssembly 环境中能够自然运行,同时保持现有的 CustomControl 设计。

与 AI 应用的协同

基于 CustomControl 的分布式结构与生成式 AI(如 GPT、Claude)高度契合。由独立模块组成的 UI 允许 AI 精确生成或增强特定组件,最大化自动化工具的效率。英雄联盟项目在 WPF 中采用了这种结构,而通过迁移到类库,在 OpenSilver 中同样能实现这一优势。

3. 项目去中心化与模式

传统 XAML 项目遵循层级结构,屏幕在主项目下垂直依赖,资源则全局管理。然而,英雄联盟项目已基于 WPF 的 CustomControl 模块化设计建立了跨平台架构。OpenSilver 为这一架构和 CustomControl 提供了与 WPF 相同的支持,使得现有结构可以原样迁移,克服了层级限制,实现灵活去中心化。

基于 CustomControl 的设计与灵活去中心化

英雄联盟项目从最初在 WPF 中就将所有 UI 元素实现为 CustomControl。该方法不仅提供了重用性和样式灵活性,还为跨平台迁移奠定了基础。由于 OpenSilver 为 CustomControl 提供了与 WPF 相同的支持,现有设计在扩展到网页环境时可以保持不变。每个组件都在 Themes/Generic.xaml 中定义了自己的模板和样式,消除了全局资源依赖,确保了独立性。

实际项目结构已经脱离了传统的层级布局,而是根据功能和需求灵活地去中心化为多个模块。以下为一个示例,直观展示了项目中非层级、独立模块的排列方式,各模块之间没有直接引用,各自基于 CustomControl,并通过依赖注入和视图注入实现灵活交互:

// 非层级、独立模块列表
// 每个模块基于 CustomControl,独立运行,无直接引用,通过依赖/视图注入交互
// 主模块与导航模块
Leagueoflegends.Main         // 负责菜单和整体屏幕布局的主屏幕
Leagueoflegends.Navigate     // 处理菜单功能的模块
// 游戏模式与屏幕模块
Leagueoflegends.Clash        // 与 Clash 相关的屏幕模块
Leagueoflegends.Home         // 主页屏幕模块
Leagueoflegends.Collection   // 收藏屏幕模块
Leagueoflegends.Shop         // 处理商城相关功能的屏幕模块
Leagueoflegends.Store        // 商店相关功能的屏幕模块
Leagueoflegends.Tft          // TFT 屏幕模块
// 用户相关功能模块
Leagueoflegends.Social       // 好友相关功能模块
Leagueoflegends.Profile      // 用户个人资料相关功能模块
// 设置与覆盖模块
Leagueoflegends.Settings     // 覆盖式设置菜单模块
// 模块之间无直接引用;可通过依赖/视图注入实现灵活连接

这一结构摒弃了传统层级方式(例如所有屏幕都依赖于主项目),而是根据功能和逻辑需求实现模块去中心化。每个模块由一组独立的 CustomControl 组成,实现独立开发、测试与部署。模块间通过接口、依赖注入和视图注入进行交互,确保了松散耦合。该方法打破了层级限制,使得不同布局和功能(例如菜单(Navigate)、主屏幕(Main)、特定功能屏幕(ClashHome 等)和覆盖设置(Settings))能够有机组合,为现代软件开发提供了最佳方案。

通过依赖注入与视图注入实现的灵活性

各模块通过依赖注入和视图注入进行交互,无需直接引用,消除了层级约束,使得每个模块在独立运行的同时又能提供集成的用户体验。例如,Main 模块可动态加载 Navigate 模块中的菜单视图,而 Settings 模块则可在需要时以覆盖方式调用。此机制使得在 WPF 中设计的结构能原样在 OpenSilver 中使用,实现运行时灵活集成模块,最大化扩展性与可维护性。

独立的资源管理

每个 CustomControl 均管理自身资源。例如,Navigate 模块中的菜单按钮或 Shop 模块中的产品卡均定义了各自的模板和样式。这一做法在 OpenSilver 中延续了 WPF 建立的资源隔离策略,使得每个模块都能独立迁移,并在跨平台迁移过程中简化平台特定的定制工作。

结论

英雄联盟项目已通过 WPF 建立了基于 CustomControl 的跨平台设计架构,而 OpenSilver 完全支持这一结构,确保了平滑迁移。此模式——通过依赖注入和视图注入实现灵活去中心化,而不受层级约束——使得 MainNavigateClashSocialProfileSettings 等模块在逻辑上和独立性上均得到了最佳组织,为现代软件开发提供了最优解决方案。

3. 跨平台响应式架构策略

跨平台响应式架构策略指的是一种设计方法,强调兼容性和迁移友好性,使得为某一 XAML 平台设计的架构能够灵活迁移到另一基于 XAML 的平台。英雄联盟项目最初基于 WPF 开发,并扩展到包括 UWP、WinUI 3、Uno Platform 和 OpenSilver 在内的多个平台,通过这一策略维护和发展了单一框架架构。本节探讨了在跨平台环境中(包括 OpenSilver)有效的架构策略。

1. IValueConverter 的使用

IValueConverterSystem.ComponentModel 命名空间中提供的标准接口,在所有基于 XAML 的平台上均可统一运行,与任何特定平台无关。英雄联盟项目利用该接口设计了平台无关的数据转换逻辑。例如,在 WPF 中定义的值转换逻辑可以在 OpenSilver 的 WebAssembly 环境中无缝运行,无需修改,最大化了跨平台迁移过程中代码的重用性。

2. VisualStateManager 的集成

VisualStateManager (VSM) 是一个强大的状态管理工具,在 WPF、UWP、WinUI 3、Uno Platform 和 OpenSilver 等各类 XAML 平台中均有一致支持。它替代了 WPF 中的 Trigger,专门用于系统化地处理复杂的 UI 状态转换和动画。英雄联盟项目利用 VSM 确保在各平台间实现一致的视觉效果——例如在所有环境中实现统一的按钮悬停状态和屏幕过渡效果。下面的 YouTube 视频展示了 VSM 应用的一个优秀案例:

  • BiliBili 项目展示链接

VSM 标准化了状态管理,无需额外的特定平台实现,在迁移过程中对保持 UI 一致性起到了至关重要的作用。

3. ICommand 与 CustomControl 的交互

英雄联盟项目将所有视图和控件实现为 CustomControl,通过 ICommand 强化了 MVVM 模式。除了依赖内置控件(如 Button)外,项目在 CustomControl 中定义了事件,并结合 DependencyProperty 自由调用 ICommandExecute 方法。该设计使得每个控件均能在跨平台环境中与 ViewModel 保持一致交互,灵活控制事件的触发时机与位置。

这一方法避免了不同平台间行为程序集(例如 System.Windows.Interactivity)差异带来的需求,并允许对冒泡和隧道事件进行细粒度控制。以下列出了一些行为程序集示例:

  • System.Windows.Interactivity
  • System.Windows.Interactivity.WPF
  • Microsoft.Xaml.Behaviors.Wpf
  • Microsoft.Xaml.Behaviors.Uwp
  • Microsoft.Xaml.Behaviors.WinUI
  • CommunityToolkit.WinUI.Behaviors
  • CommunityToolkit.Uwp.Behaviors
  • Uno.Microsoft.Xaml.Behaviors.Interactivity
  • Uno.Microsoft.Toolkit.Uwp.UI.Behaviors
  • Avalonia.Xaml.Interactivity

如上所示,不同平台间的行为各有差异,容易引起混淆并限制集成,而该方法则实现了必要的 MVVM 交互,无需额外行为支持,从而提升了跨平台兼容性。

4. 跨平台依赖注入策略

. NET 提供的标准依赖注入(Microsoft.Extensions.DependencyInjection)主要面向 SPA(单页应用)架构的生命周期,例如 ASP.NET。然而,对于像 WPF 这样的桌面应用,TransientScopedSingleton 等生命周期并不总是适用。

例如,在使用 CommunityToolkit.Mvvm 时,可以利用标准 DI 作为默认依赖注入来实现 MVVM 模式。另一方面,专为 XAML 应用设计的 Prism 则允许将 MVVM 与其自有的 IoC 容器集成。

值得注意的是,CommunityToolkit.Mvvm 同时支持标准 DI 和基于 .NET 通用接口 IServiceProvider 的 DI,提供了更大的灵活性。然而,Prism 的 DI 运行于其自有的 IContainerProvider 上,这意味着不能将 CommunityToolkit.Mvvm 默认的 DI 替换为 Prism 的 DI。不过,这两个框架可以组合使用。尽管如此,英雄联盟项目选择开发并应用自有基于 .NET Standard 2.0Jamesnet.Foundation 框架,而不是依赖这些外部框架。

Jamesnet.Foundation 框架在 WPF、WinUI 3、UWP、Uno Platform 和 OpenSilver 中统一实现了依赖注入和 MVVM 模式,全面支持视图与视图模型之间的数据上下文绑定映射、视图模型之间的交互接口以及依赖注入管理。通过整合所有管理点,即使在跨平台迁移过程中,也能保持并发展单一架构。作为开源项目,Jamesnet.Foundation 已包含在英雄联盟系列源代码中,任何人均可访问。

结论

英雄联盟项目的跨平台响应式架构策略通过使用 IValueConverterVisualStateManagerICommand 和依赖注入,实现了各基于 XAML 平台间的兼容性和灵活性。借助如 Jamesnet.Foundation 这样的统一框架,该项目不仅实现了从 WPF 到 OpenSilver 的迁移,而且在多样环境中保持了一致的架构,为现代 XAML 开发提供了一种经过优化的方法。

4. 结论

这次 OpenSilver 迁移证实了 WPF 的技术优势可以忠实地在网页环境中实现。尤其令人印象深刻的是,现有的 WPF 开发体验可以自然地扩展到网页上,这有望为 XAML 开发者开辟新的可能性。

Jaewung Lee
来自韩国的微软 MVP Jaewung 专注于将 WPF、Uno Platform、WinUI 3、UWP 和 OpenSilver 等多种基于 XAML 的平台统一到一个框架中。作为 OpenSilver 的倡导者,他提出了将 WPF 技术扩展到网页环境的创新方法。

Yang Qu
来自中国的微软 MVP Yang 是一位专注于 WPF 的开发者,她成功展示了英雄联盟 WPF 版本向 OpenSilver 的迁移。她还通过各种渠道积极活动和提供 WPF 技术相关教程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890438.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Raspberry Pi Imager removed Advanced Menu All In One

Raspberry Pi Imager removed Advanced Menu All In One Raspberry Pi Imager 已删除高级菜单Raspberry Pi Imager removed Advanced Menu All In OneRaspberry Pi Imager 已删除高级菜单raspberry pi imager advanced options missing demos树莓派 bugRaspberry Pi Imager v1.…

作业一 自我介绍+软工5问

| 这个作业属于哪个课程 | <班级> | | ----------------- |--------------- | | 这个作业要求在哪里| <作业要求> | | 这个作业的目标 | <- 介绍自己,比如兴趣爱好,学习或者生活经历,认为有趣或者值得向别人展示的记忆快速阅读教材,提出5个想弄懂的问题。 想…

《软件开发与创新课程设计》第一次作业:软件二次开发

一、项目名称与来源 该项目名为体育新闻信息查询系统,源码来自同学。 二、目的 项目体育新闻信息查询系统的目的是基于Java和JavaScript创建一个能够查询体育新闻的web系统。本次作业的目的是基于该系统的基础上进行二次开发。 三、部分原代码 1.体育新闻网点击查看代码 <!…

如何更改 debian 系统家目录中文件夹的语言

一、当前家目录文件夹是中文 当时安装系统的时候,选择了中文,导致家目录的文件夹也是中文的。这导致在命令行中会出现中文路径,现在想把它改成英文的。二、改成英文 家目录的 .config 文件夹中有两个文件与此相关,它们分别是: # /home/xxx/.config user-dirs.dirs user-di…

C++ 超市零售系统二次开发

一、来源 本次分析与二次开发的超市零售系统项目名称为 "SimpleSupermarketManagement", 作者是 GitHub 用户 "CodeExplorer1995",项目地址为https://github.com/CodeExplorer1995/SimpleSupermarketManagement。该项目旨在为小型超市提供基础的业务管理…

IOC 和 DI 详解及其简单用法

1. IOC 详解 1.1 Bean 的声明 IOC 控制反转,就是将对象的控制权交给 Spring 的 IOC 容器,由 IOC 容器创建及管理对象。IOC 容器创建的对象称为 bean 对象。 而 Spring 框架为了更好的标识 Web 应用程序开发当中,bean 对象到底归属于哪一层,又提供了 @Component 的衍生注解:…

开源一款DDS信号发生扩展板-FreakStudio多米诺系列

信号发生扩展板通过SPI接口生成可调频率和幅度的正弦波、方波和三角波,频率小于1MHz。支持幅度调节,提供原始和6倍放大输出接口。配备5阶低通滤波器、噪声抑制功能,优化信号稳定性。原文链接: FreakStudio的博客 摘要 信号发生扩展板通过SPI接口生成可调频率和幅度的正弦波…

Windows系统更改/迁移用户目录

Windows系统更改/迁移用户目录Windows系统更改/迁移用户目录 迁移的原因C盘空间不足 不想将我的文档等放在C盘,方便重做系统 其他原因迁移有什么风险么目前没发现有什么风险迁移过程 准备工作 更改/迁移用户目录之前先自行备份当前用户的资料(下载目录、桌面文件等),以免数…

[2025.2.26 JavaWeb学习]登录校验

流程图会话技术指浏览器与服务器的一次连接,直到某一方断开,某个浏览器的一次会话可以包含多次请求和响应会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据

cmcc_simplerop

打开ida查看,可以看到是静态编译,所以无法常规用ret2libc此时可以用最简单的方法系统调用 首先ida上面的偏移量是错误的,我们手动用gdb算一下距离ebp为0x1c因为要实现execve("/bin/sh",0,0)找int 0x80,eax,ebx,ecx,edx因为程序里面没有binsh或sh,所以我们得手动…

day4复健-字符串

题目练习:反转字符串 知识学习: StringBuilder:内容可变的字符串容器StringJoiner练习: 阿拉伯数字转换为罗马数字练习2:练习3:

软件开发与创新——万年历功能新增与代码优化

一、项目名称与来源 上海海洋大学C语言期末大作业 二、原项目运行 运行环境: 系统:Windows11 24H2 cpu:i7-10750H 编译器:Dev c++ 5.11 运行结果:点击查看代码 #include <stdio.h> #include <stdlib.h>// 定义每个月的天数,第一行为平年,第二行为闰年 int d…