WPF做的小型音乐播放器升级版

摘要:
仅完成加载频道列表和播放歌曲的功能。这些天,搜索模块在家中处理后会发送一条事件消息。频道模块基于所选择的搜索结果构建适当的频道,并向玩家发送事件通知。播放器根据当前频道加载歌曲。这种设计的优点是,现在它是通过将模块注册到TabControl来实现的。它更容易管理。有一个小功能,

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

首先看下部分功能截图:

WPF做的小型音乐播放器升级版第1张

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

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

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

WPF做的小型音乐播放器升级版第2张

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

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

WPF做的小型音乐播放器升级版第3张

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

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

WPF做的小型音乐播放器升级版第4张

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

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

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

WPF做的小型音乐播放器升级版第5张

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

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

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

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

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

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

最后还是放上源码.

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

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

源码下载

免责声明:文章转载自《WPF做的小型音乐播放器升级版》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ORACLE 多表关联 UPDATE 语句如何学习cocos2d-x下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

10款最好用的移动web开发工具

摘要: 对于新款手机来说,好的开发工具变得越来越重要。手机(尤其是iPhone和Android)中的小工具(小软件)非常的重要,而要开发这些小软件就要选择合适的开发工具。另外,HTML5提供了很多易于移动web开发的特性。例如,所有的网站都是开发放式的,不需要授权;... 对于新款手机来说,好的开发工具变得越来越重要。手机(尤其是iPhone和Androi...

Python源码剖析之编译Python

在剖析源码的过程中,最好的学习方法是不断根据掌握的知识修改Python源代码,以印证自己的知识和猜想。 一、Python总体架构   在最高的层次上,Python的整体架构可以分为三个主要部分,如上图,左边的Core Modules(内置模块)、Library(库)以及User-defined Modules(用户自定义模块)。   在图的右边,是Pyt...

Python学习日记(十九) 模块导入

模块导入 当文件夹中有这样一个自定义的command模块 在它的内部写下下列代码: print('这个py文件被调用!') def fuc(): print('这个函数被调用!') 然后我们在command模块中执行下列代码: import command #这个py文件被调用! 我们如果在这段程序中反复执行多次这一段代码,这一个文...

.NET5发布

.NET Conf 2020于2020年11月10日举行,会上正式发布.NET 5。.NET 5是.NET平台统一的第一个版本。 .NET 5 SDK和Visual Studio 2019 v16.8版本在11月10日已经提供下载,更新Visual Studio 2019 版本至v16.8以支持.NET 5。 此次更新,更新了很多重要功能。包括但不仅限于以...

0703-spring cloud config-git配置属性加解密之对称加密

一、概述   可以使用{cipher} *格式的加密值,只要有一个有效的密钥,那么它们将在主应用程序上下文获取环境之前被解密。要在应用程序中使用加密功能,您需要在您的类路径中包含Spring Security RSA(Maven协调“org.springframework.security:spring-security-rsa”),并且您还需要JVM中的...

Android开发之Instrumentation(自动化测试)

Android在JUnit的之外给我们又提供了Instrumentation测试框架。通过Instrumentation可以模拟按键按下、抬起、屏幕点击、滚动等事件,有效地控制Activity进行自动化测试。 Instrumentation是执行application instrumentation代码的基类。当应用程序运行的时候instrumentati...