随笔 - 18  文章 - 0 评论 - 376 阅读 - 10万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

上一个版本 是利用周日休息时间制作的,考虑不充分,开发时间也短,只完成了加载频道列表和播放歌曲的功能.这几天晚上在家进行了部分加工,首先是完善了部分功能,其次对部分不合理的设计进行了重构(还不知道重构得合理不合理).

首先看下部分功能截图:

首先是搜索功能完成了部分.点击搜索功能会切换到该频道,并加载歌曲放歌.设计时,就把搜索做成了一个模块,频道是一个模块,播放器是一个模块.选中搜索结果,会由搜索模块发出事件消息.频道模块根据选中的搜索结果构造合适的频道,并发出事件通知播放器.播放器根据当前频道再加载歌曲.

这样子设计的好处是,模块只需要关心自己的业务逻辑,方便维护.比如,所有对频道的操作都是在频道模块内,所有对歌曲的操作都是在播放器模块,不会造成逻辑混乱.

其次就是左侧的导航,以前是在页面写了5个Region,这样很傻的,现在是通过把模块注册到TabControl的方式来实现.这样更好方便管理.

有个小功能,在不同的歌曲时,会根据封面图片切换背景色.设计时把封面做成了一个模块,封面模块会监听切换歌曲的事件,并下载图片.图片下载完毕后,通知主界面更换背景色.

这里更可以看到,在ViewModel通过调用InteractionRequest或者其他的方式来操作动画是没有任何问题的.

弹出的子窗口,也会跟着主窗口变色,这个用个绑定就实现了.程序里定义了一个ChildWindowViewModelBase类,专门处理弹出窗口,在ViewModel内部可以实现窗口的打开关闭等常用功能.

这里的窗口打开后,对应按钮是灰掉的.只需要保证按钮和窗口的DataContext是同一个ViewModel,再利用一个IsOpen的属性就很好实现了.如果用事件驱动,就不得不注册一堆事件来实现这个功能,这也体现了MVVM把UI和逻辑分开的优势.

应用程序内置了一个捕捉异常的模块,这里是通过应用程序发起一个出错的事件消息,ExceptionViewModel捕捉到后记录日志,打开提示框.

现在的项目采用了大量的事件消息.比如:所有模块加载完毕会发出一个事件消息,Channel模块捕捉到后会开始加载频道,Account模块会开始尝试自动登录等等.应用程序退出会发出一个事件消息,右下角气泡(Notify模块)会释放资源.

合理的采用事件(EventAggregator)会避免模块之间的强引用,实现解耦.

现在的解决方案已经颇具规模了.接下来可能再加入一个歌词模块,然后就不会有新的模块了.

这里得说下分这么多模块的好处:

首先,按照上面说的,把业务逻辑分到不同的模块,方便维护.如果是团队开发,那么把模块分给不同的开发人员,互相的开发工作也不会受到影响.

其次,模块可以实现按需加载.目前项目中模块是全部加载的,我们可以做个适当的判断,只加载其中部分.最关键的是,由于模块之间没有强引用,缺少部分模块对应用程序不会产生任何影响!可能你只是不能搜索,或者不能登录,或者不能放歌,但是应用程序会正常运行,而且其他模块的操作都可以正常进行.

第三,可以随时建立模块来替换以前的模块.同上所述,这样的替换操作不会对应用程序带来任何影响.

 

目前很多功能都不完善,我会慢慢的把功能都补上,并尝试加点自己觉得有用的东西.当然,所有的代码都是以Prism为框架,MVVM模式为指导思想.

最后还是放上源码.

注意:此项目UI和部分逻辑参考了开源的音乐播放器 豆瓣电台 ,请大家只用来做学习和拍砖楼猪的武器就行了.

再注意:项目采用VS2012开发,VS2012SP1能顺利打开.

源码下载

posted on   烟灰灰  阅读(6354)  评论(41编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示