NAIVE 播放器的实现
首先,这次任务最基本的功能就是实现对固定类型文件的选择和播放器对选择的文件进行播放。然而在考虑之后,我觉得这样的功能太单调,想添加一个自己写的播放列表的功能,让用户可以多次选择文件,然后按顺序播放列表中的文件。
那么基础部分的需求就是
1.进行基本的布局
2.进行文件的选择
3.让播放器播放用户选择的文件
4.让播放器识别播放的是音频还是视频。
第一点,布局方面采用grid之间的嵌套,比较轻松的就实现了。
第二点就是文件的选择,提到文件的选择,我就直接想到了上次作业中我看到的
所以我就根据Open files中的代码写出了对文件的选择,其中要求选择MP3和MP4,所以
picker.FileTypeFilter.Add(".mp3");
picker.FileTypeFilter.Add(".mp4");
改成如上代码,就能从本地选择文件了。
3.让播放器播放用户选择的文件,这个功能又让我想到了上次作业中的play videos,于是我就选择了文章中提到了的mediaplayelement,这个选择能够让我轻松的操控播放器播放用户选择的文件,只需将该控件的Source设置成我们刚才选择的文件的路径,之后调用play方法就可以了。
然而选择MediaplayerElement让我在做扩展功能的时候遇到了一些麻烦,当然这是后面说到的了。
4.以上的工作都完成之后,还有一个要求就是要播放器识别自己播放的是video还是audio。
最一开始我想直接使用File.contentType的equal方法直接进行比较,结果当我辛辛苦苦输出了播放video和audio时候的contentType,并将用户选择文件的contentTypee进行比较的时候,却发现这个方法并不好用,于是我查阅了相关的资料,得到了判断文件类型,利用文件的扩展名来判断用户播放文件时的文件类型,我使用indexOf方法进行判断并且对用户进行了提示,然而在之后的查阅中我又找到了可以不通过扩展名判断用户播放的文件类型,这个我们之后在扩展部分再说。
这样基础的功能就得到实现了,然而我并不满足于此,开始了扩展部分的开发。
请忽略那一排特别丑的暂无
在这之后我又开始了“困难重重”的扩展部分的开发,首先我们来分析一下扩展部分的需求
1.实现一个列表,这个列表能够显示一个队列,队列的内容是用户选择的多个文件名
2.在用户选择列表中已有文件的时候提示用户已有该文件。
3.在播放器播放完一个文件后立刻播放下一个文件,之后当无文件可播出的时候给用户选择文件的提示。
4.对列表中项通过按钮进行控制和删除
在思考了一会儿之后,我决定第四个功能再之后的开发中添加,先完成前三个需求。
首先第一个需求,我决定使用列表和数据绑定来实现,首先我先了解了一下列表相关的控件,之后决定使用Listbox来实现这个功能,原因是Listbox中有Itemsource属性,可以直接将数据绑定在一个数组上,而如果要开发这样一个文件列表,我们正好需要一个数组来存放用户选择的文件们,并且可以随着用户的选择动态改变大小。所以我就参考了WPF中ListBox的创建和多种绑定用法中的写法
写了个
(以上代码为最终修改过的代码)
来尝试这模仿并且将数据绑定在songname数组上。。。
结果!结果!! 不好使!!!
能够在界面上看到一个item,但是item上面一个字都没有,选择了第二个文件也不会多一个item,我还设置断点来看看是不是数据没绑定上,结果那个itemsource里面就是我songname的数组,里面的内容也和预期的一样。。。结果奋战了二十分钟之后我也不知道问题出在哪儿了(教练。。。这感觉和vue之类的数据绑定不太一样啊!)最后毅然决定——使用一种粗糙的方式来代替,所以就有了现在版本非常丑陋并且非常不合理的五个textbox和c#中一堆恶心的代码,经过调试,它虽然恶心了点,但是终于能满足我的需求了。。。在之后的版本我一定要把这个东西改成数据绑定,用textbox会导致很多问题,文件列表中文件的数量都变成恒定的了。。。
之后对于需求二,我首先决定使用文件的equal方法,结果发现完全没效果。。。所以我又去查阅了资料C# 如何判断两个文件内容是否相同的方法 结果上来就是一个哈希码生成,虽然再弄个数组存放这些文件的哈希码没什么太大的困难就是了。。。但是被需求一搞得头有点大的我迅速就选择了放弃,也打算在之后的版本进行更新(打算在成功进行数据绑定之后)。
最后的需求三,真的是被之前的选择坑到了!
首先提到播放结束,自然而然就想到播放结束的事件,所以我去查阅mediaplayerelement有关媒体播放结束的事件
结果!结果!! 没查到!!!
我心想,不对啊,一个播放器怎么能没有播放结束的事件呢?!结果我一查阅资料,发现人家都是用MediaElement控件的。。。差了一个player至于差那么多吗。。。当然也有可能是我看漏了没找到mediaplayerelement的媒体播放事件。。。但是我不得不因此更换了控件的使用,结果在SRC路径那里出了点小问题,于是我臭不要脸的参考了李京懋同学的博客,借鉴了(其实是复制粘贴了)他选取路径部分的两行代码(真的只有两行),之后将他那里的变量名改成我的,之后写一个播放结束事件,将现有文件数组的列表的第一项踢出去,之后再播放,调整右边的文件名列表,OK!大功告成。
然而虽然(看上去)完成了我自己的需求,然而有以下几点需要在之后的开发中解决(希望老师下次作业不是添加个播放列表。。。)
1.不再根据扩展名判断文件格式,而是使用c#判断文件格式中提到的方法进行判断。
2.绑定数据到Listbox上,这点特别重要,否则会有很多问题出现,比如用户不得添加超过5项到文件列表中,也使代码不堪入目。。。
3.判断下重复的文件,利用上面C# 如何判断两个文件内容是否相同的方法来进行判断。
这三点就是我之后需要更新并且改进的内容。
说了这么多废话还没放上我的项目地址,那就把它放在这篇文章的结尾吧。