zoukankan      html  css  js  c++  java
  • WPF做的小型音乐播放器升级版

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

    首先看下部分功能截图:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    最后还是放上源码.

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

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

    源码下载

  • 相关阅读:
    oracle 10g 免安装客户端在windows下配置
    sql2005 sa密码
    使用windows live writer 有感
    windows xp SNMP安装包提取
    汉化groove2007
    迁移SQL server 2005 Reporting Services到SQL server 2008 Reporting Services全程截图操作指南
    foxmail 6在使用中的问题
    AGPM客户端连接不上服务器解决一例
    SpringSource Tool Suite add CloudFoundry service
    Java 之 SWing
  • 原文地址:https://www.cnblogs.com/scheshan/p/2750504.html
Copyright © 2011-2022 走看看