BiliBili-UWP深度解析:基于MVVM架构的Windows平台B站客户端开发实战
【免费下载链接】BiliBili-UWPBiliBili的UWP客户端,当然,是第三方的了项目地址: https://gitcode.com/gh_mirrors/bi/BiliBili-UWP
BiliBili-UWP是一款基于UWP(Universal Windows Platform)架构开发的第三方B站客户端,为Windows用户提供了原生化、高性能的视频观看体验。该项目采用MVVM设计模式,通过模块化架构实现了B站核心功能的重构与优化,展现了在桌面环境下移动应用界面适配的创新解决方案。本文将深入探讨其技术架构、API通信机制、UI适配策略以及性能优化方案。
一、MVVM架构设计与核心组件
1.1 分层架构实现
BiliBili-UWP采用清晰的三层架构设计,确保代码的可维护性和扩展性:
核心服务层(BiliBili-Lib):位于BiliBili-Lib/Service/目录,包含BiliBiliClient、AccountService、VideoService等核心业务逻辑类。这一层负责与B站API通信、数据处理和业务逻辑封装,完全独立于UI层。
// BiliBiliClient作为统一入口点 public class BiliBiliClient { public AccountService Account; public ChannelService Channel; public TopicService Topic; public VideoService Video; public AnimeService Anime; public BiliBiliClient(string accessToken = "", string refreshToken = "", int expiry = 0) { // 初始化各服务实例 } }UI组件层(BiliBili-Controls):提供自定义控件库,包括自适应网格视图、气泡控件、虚拟化面板等,增强了应用的视觉表现力和交互体验。
应用呈现层(BiliBili-UWP):主应用程序层,包含页面布局、视图模型和用户界面逻辑,实现了桌面模式与平板模式的双重适配。
1.2 ViewModel核心设计
项目采用双ViewModel架构,通过AppViewModel和BiliViewModel两大核心ViewModel管理应用状态:
- AppViewModel:管理应用级状态,包括页面导航、播放器控制、窗口尺寸响应等全局功能
- BiliViewModel:处理B站业务逻辑,封装API调用、数据缓存和用户状态管理
// ViewModel中的属性绑定示例 public partial class BiliViewModel : NotifyPropertyBase { public ObservableCollection<RegionContainer> RegionCollection = new ObservableCollection<RegionContainer>(); public ObservableCollection<VideoRecommend> RecommendVideoCollection = new ObservableCollection<VideoRecommend>(); public BiliBiliClient _client; // 数据绑定支持属性变更通知 }BiliBili-UWP启动界面采用响应式设计,适配不同分辨率设备
二、API通信与数据处理机制
2.1 统一API端点管理
项目在BiliBili-Lib/Models/Others/Api.cs中集中管理所有B站API端点,采用常量定义方式确保类型安全:
public class Api { public const string _apiBase = "https://api.bilibili.com"; public const string _appBase = "https://app.bilibili.com"; public const string _vcBase = "https://api.vc.bilibili.com"; // 验证相关API public const string PASSPORT_KEY_ENCRYPT = _passBase + "/api/oauth2/getKey"; public const string PASSPORT_LOGIN = _passBase + "/api/v3/oauth2/login"; // 视频相关API public const string VIDEO_DETAIL = _apiBase + "/x/web-interface/view"; public const string VIDEO_PLAY_URL = _apiBase + "/x/player/playurl"; }2.2 智能数据缓存策略
应用实现了智能的数据缓存策略,在网络请求失败时自动使用本地缓存数据:
public async Task GetRegionsAsync() { RegionCollection.Clear(); var regions = await _client.GetRegionIndexAsync(); if (regions != null) { // 网络成功,更新本地缓存 await IOTool.SetLocalDataAsync("region.json", JsonConvert.SerializeObject(regions.Where(p => p.children != null).ToList())); } else { // 网络失败,使用本地缓存 regions = await IOTool.GetLocalDataAsync<List<RegionContainer>>("region.json"); } regions.Where(p => p.children != null).ToList().ForEach(p => RegionCollection.Add(p)); }三、响应式UI设计与多模式适配
3.1 桌面与平板双模式架构
项目最大的技术特色之一是实现了桌面模式与平板模式的无缝切换,通过不同的页面布局策略适应不同设备:
- 桌面模式:采用经典的Master-Detail设计,左侧导航栏+右侧内容区域,适合鼠标键盘操作
- 平板模式:借鉴XBOX界面设计,横向滚动为主,大留白设计,优化触摸操作体验
<!-- 桌面模式主页面布局 --> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <!-- 左侧导航区域 --> <local:SidePanel x:Name="SidePanel" Grid.Column="0"/> <!-- 右侧内容区域 --> <local:PagePanel x:Name="PagePanel" Grid.Column="1"/> </Grid>3.2 动态响应式布局系统
应用内置了完善的响应式布局系统,通过AppViewModel.StateChangeWidth属性动态调整界面布局:
public class AppViewModel { public double StateChangeWidth = 1000; public void WindowSizeChangedHandle(object sender, WindowSizeChangedEventArgs e) { if (WindowsSizeChangedNotify.Count > 0) { WindowsSizeChangedNotify.ForEach(p => p.Item2?.Invoke(e.Size)); } } }宽屏Logo适配不同设备比例,提供一致的用户体验
四、视频播放器技术实现
4.1 多格式视频支持
VideoPlayer控件是项目的核心技术组件,支持多种视频播放模式和画质切换:
public sealed partial class VideoPlayer : UserControl { private ObservableCollection<Tuple<int, string>> QualityCollection = new ObservableCollection<Tuple<int, string>>(); private ObservableCollection<Tuple<double, string>> PlayRateCollection; // 支持多种播放模式 public enum PlayerType { Normal, FullWindow, Cinema, CompactOverlay } }4.2 弹幕系统集成
项目集成了NSDanmaku弹幕引擎,提供了完整的弹幕显示和交互功能:
using NSDanmaku.Helper; using NSDanmaku.Model; // 弹幕初始化与配置 private void InitDanmaku() { _danmakuView = new DanmakuView(); _danmakuView.DanmakuArea = DanmakuArea; _danmakuView.DanmakuSize = DanmakuSize; }五、性能优化与虚拟化渲染
5.1 自定义虚拟化面板
项目在BiliBili-Controls/CustomPanel/目录中实现了自定义虚拟化面板,优化大量数据项的渲染性能:
public class VirtualizingPanel : Panel { // 仅渲染可视区域内的项目 protected override Size MeasureOverride(Size availableSize) { // 虚拟化测量逻辑 } protected override Size ArrangeOverride(Size finalSize) { // 虚拟化布局逻辑 } }5.2 异步数据加载策略
所有网络请求都采用异步模式,避免UI线程阻塞:
public async Task<List<VideoRecommend>> GetRecommendVideoAsync(int idx = 0) { var param = new Dictionary<string, string>(); param.Add("idx", idx.ToString()); param.Add("flush", "0"); param.Add("column", "4"); param.Add("device", "pad"); string url = BiliTool.UrlContact(Api.VIDEO_RECOMMEND, param, true, useiPhone:true); var data = await BiliTool.ConvertEntityFromWebAsync<List<VideoRecommend>>(url, "data.items"); return data ?? new List<VideoRecommend>(); }六、安全与认证机制实现
6.1 OAuth2令牌管理
应用实现了完整的OAuth2令牌管理机制,支持访问令牌的自动刷新:
public class TokenPackage { public string AccessToken { get; set; } public string RefreshToken { get; set; } public int Expiry { get; set; } public TokenPackage(string accessToken, string refreshToken, int expiry) { AccessToken = accessToken; RefreshToken = refreshToken; Expiry = expiry; } }6.2 本地数据加密存储
敏感用户数据采用本地加密存储,保护用户隐私:
public class BiliSecure { // 用户数据加密存储实现 public string EncryptData(string data) { /* 加密逻辑 */ } public string DecryptData(string encryptedData) { /* 解密逻辑 */ } }七、技术架构总结与最佳实践
7.1 核心架构优势
| 架构层面 | 技术实现 | 优势 |
|---|---|---|
| 数据层 | 统一API管理 + 智能缓存 | 网络容错性强,响应速度快 |
| 业务层 | MVVM模式 + 服务封装 | 代码解耦,易于测试和维护 |
| UI层 | 响应式设计 + 虚拟化渲染 | 性能优化,多设备适配 |
| 安全层 | OAuth2 + 本地加密 | 用户数据安全有保障 |
7.2 开发最佳实践
- 模块化设计:将功能拆分为独立模块,便于团队协作和代码复用
- 异步编程:所有网络操作采用async/await模式,避免UI阻塞
- 数据绑定:充分利用XAML的数据绑定机制,减少代码耦合
- 错误处理:统一的异常处理机制,提升应用稳定性
- 性能监控:关键操作添加性能监控点,便于优化
7.3 扩展性设计
项目架构为未来扩展留下了充分空间:
- 插件系统接口:预留了插件扩展接口
- 主题系统支持:支持深色/浅色主题切换
- 多语言适配:资源文件分离,便于国际化
- API版本兼容:通过抽象层隔离API变化
八、技术挑战与解决方案
8.1 移动端API适配桌面环境
项目面临的最大挑战是将为移动端设计的B站API适配到桌面环境。解决方案包括:
- 参数适配:通过
device=pad等参数模拟平板设备获取更适合桌面的数据格式 - UI重组:将移动端卡片式布局转换为桌面端的多列网格布局
- 交互优化:将触摸手势转换为鼠标键盘操作,同时保留触摸支持
8.2 性能优化策略
针对UWP平台特性,项目实施了多项性能优化:
- 虚拟化列表:对视频列表、评论列表等大量数据项进行虚拟化渲染
- 图片懒加载:仅当图片进入可视区域时才加载显示
- 数据预加载:预测用户行为,提前加载可能需要的下一页数据
九、技术生态与未来发展
9.1 依赖的技术栈
- 核心框架:UWP (Universal Windows Platform)
- UI框架:XAML + WinUI
- 网络库:System.Net.Http + 自定义封装
- JSON处理:Newtonsoft.Json
- 弹幕引擎:NSDanmaku
- 视频播放:SYEngine + Windows.Media.Playback
9.2 开源贡献指南
项目采用模块化设计,便于开发者参与贡献:
- API模块:在
BiliBili-Lib/Service/中添加新的服务类 - UI组件:在
BiliBili-Controls/中开发自定义控件 - 页面扩展:在
BiliBili-UWP/Pages-*目录中创建新页面
总结
BiliBili-UWP项目展示了如何将移动优先的Web API成功适配到桌面环境的技术实践。通过MVVM架构、响应式设计、虚拟化渲染等现代前端技术,项目在保持B站原生体验的同时,提供了更适合桌面操作的交互方式。项目的模块化设计、清晰的代码结构和完整的功能实现,都体现了高质量软件工程的最佳实践。
对于希望深入学习UWP开发、理解大型客户端应用架构的开发者来说,BiliBili-UWP的源代码是一个极佳的学习资源。特别是其在API适配、性能优化和跨设备界面设计方面的创新,为桌面端应用开发提供了宝贵的技术参考。
【免费下载链接】BiliBili-UWPBiliBili的UWP客户端,当然,是第三方的了项目地址: https://gitcode.com/gh_mirrors/bi/BiliBili-UWP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考