在上一篇,我们了解了如何在Silverlight的Out of browser模式下进行DeBUG调试,另外学习Silverlight OOB应用的一个新特性Notifications窗口。本篇,我们将结合以往的Out of browser特性,创建一款新的Out of browser实例, 音乐播放器。 该实例目的比较简单,实现音乐播放,实现音乐文件列表读取,实现音乐文件信息读取,另外音乐播放自动跳转等功能。
在实例开始前,我们仍旧需要了解一些基础知识。Silverlight对音频的支持是使用MediaElement类,该类使用方法非常简单,该类的详细解释,请看MSDN
1 < MediaElement
2 x:name ="media"
3 Source ="xBox.wmv" 4 CurrentStateChanged ="media_state_changed" 5 WIDth ="300" Height ="300" />
在了解了音频播放类的简单使用后,让我们先看看项目完成后的效果图,
从上面效果图中可以看出整个实例项目UI分5个部分,
1. 音频控制部分,这部分是实例主要功能;
2. 音频文件信息部分,这部分是获取显示当前和下一首音乐文件信息;
3. 唱片图片信息,其实这部分也是属于音频文件信息,不过这里单独列出来,使用独立的类进行处理;
4. 音频文件列表,该列表是载入My Music目录中的音乐文件,并支持用户选择播放功能;
5. UI控制,该部分可以使播放器进入最小化状态。例如:
下面我们开始分别解释以上几个部分的实例设计方法。
我们仍旧使用SilverlightOOBDemo项目,不过为了使代码更清晰易读,这次不再使用OutofbrowserMainPage作为OOB应用主界面,我们重新创建一个新的OOB应用界面OutofbrowserMusicPlayer。
为了修改启动页面为OutofbrowserMusicPlayer,为此,我们需要修改App.xaml中的启动页面代码:
1 private voID Application_Startup( object sender, StartupEventArgs e)
2 {
3 if ( ! Application.Current.IsRunningOutOfbrowser)
4 {
5 this .RootVisual = new MainPage();
6 }
7 else
8 9 // this.RootVisual = new OutofbrowserMainPage(); 10 OutofbrowserMusicPlayer();
11 12
13 }
根据实例需求,我们最主要的功能就是播放音乐,所以,我们第一步首先实现Out of browser应用音频控制。
1. 创建自定义音频控制控件;
对于音频控制,这里我们使用了自定义控件控制音乐的播放。AudioControl.xaml控件,
这里我仅贴上部分代码,大家可以在文章最后下载完整源代码。
1 < GrID x:name ="LayoutRoot" >
2 GrID.ColumnDeFinitions 3 ColumnDeFinition WIDth ="auto" />
4 ="*" 5 ="25" 6 7 8 </ 9 GrID.Column ="0" margin ="0,0" HorizontalAlignment ="left" VerticalAlignment ="Center" x:name ="grIDCol1" 10 Togglebutton Cursor ="Hand" ="btnPlay" RendertransformOrigin ="0.5,0.5" Template =" {StaticResource playControlTemplate} " 11 Togglebutton.Rendertransform 12 transformGroup 13 Scaletransform ScaleX ="1" ScaleY ="1" 14 Skewtransform 15 Rotatetransform 16 Translatetransform 17 18 19 Togglebutton 20 GrID 21 ="Stretch" ="grIDCol2" ="Center" 22 23 24 ="40" 25 ="10" 26 27 28 TextBlock ="tbCurrentTime" Height ="12" FontFamily ="Verdana" FontSize Text ="00:00" textwrapPing ="Wrap" Foreground ="#FFFFFFFF" FontStyle ="normal" ="Right" TextAlignment GrID.Column 29 margin ="/" ="2" 30 ="tbTotalTime" ="3" 31 local:MediaSlIDer Maximum ="100" ="slIDerTimeline" Style {StaticResource progressSlIDerStyle} " Value Visibility ="Visible" 32 33 ="2" ="4,4,255)">="grIDCol3" 34 local:Spinner ="spinner" WIDth ="17" Height 35 36 ="3" ="grIDCol4" ="70" d:LayoutOverrIDes ="Height" 37 ="70" 38 39 40 41 42 HorizontalAlignment IsChecked ="True" ="btnSpeaker" {StaticResource speakerControlTemplate} 43 SlIDer ="3,255)">="slIDerVolume" {StaticResource volumeSlIDerStyle} Background ="#FF777777" 44 45 46 ="4" ="grIDCol5" 47 ="btnFullScreen" {StaticResource fullScreenControlTemplate} 48 49 >
从以上代码可以看到,在AudioControl中有两个自定义控件local:MediaSlIDer和local:Spinner。
MediaSlIDer:
其功能是控制音乐播放进度,支持拖拽前进或者后退音乐播放进度。其代码如下:
1
public class MediaSlIDer : SlIDer2 {
3 Thumb horizontalThumb;
4 FrameworkElement horizontalleftTrack;
5 FrameworkElement horizontalRighttrack;
6 double oldValue 0 , newValue ;
7 event RoutedPropertyChangedEventHandler < > MyValueChanged;
8 MyValueChangedindrag;
9 dispatcherTimer dragtimer dispatcherTimer();
10 dragTimeElapsed 11 const short DragWaitThreshold 200 100 12 Rectangle progressRect null 13 bool dragSeekJustFired false 14 15 MediaSlIDer()
16 {
17 18 .ValueChanged += (CustomSlIDer_ValueChanged);
19 dragtimer.Interval TimeSpan( 20 dragtimer.Tick EventHandler(dragtimer_Tick);
21 }
22 23 dragtimer_Tick( 24 25 dragTimeElapsed DragWaitInterval;
26 27 (dragTimeElapsed >= DragWaitThreshold)
28 29 RoutedPropertyChangedEventHandler handler 30
31 ((handler != ) && (newValue prevNewValue))
32 {
33 handler( RoutedPropertyChangedEventArgs (oldValue, newValue));
34 dragSeekJustFired true 35 prevNewValue newValue;
36 }
37 38 dragTimeElapsed 39 40 41 42 CustomSlIDer_ValueChanged( e)
43 44 oldValue e.oldValue;
45 newValue e.NewValue;
46 47 (horizontalThumb.IsDragging)
48 49 50 dragtimer.Stop();
51 dragtimer.Start();
52 dragSeekJustFired 53 54 55 56 overrIDe OnApplyTemplate()
57 58 base .OnApplyTemplate();
59 60 horizontalThumb GetTemplateChild( " HorizontalThumb " as Thumb;
61 horizontalleftTrack leftTrack FrameworkElement;
62 horizontalRighttrack Righttrack 63 progressRect Progress Rectangle;
64 65 (horizontalleftTrack ) horizontalleftTrack.MouseleftbuttonDown MousebuttonEventHandler(OnMoveThumbToMouse);
66 67 (horizontalRighttrack ) horizontalRighttrack.MouseleftbuttonDown 68 69 horizontalThumb.DragCompleted DragCompletedEventHandler(DragCompleted);
70 71 progressRect.WIDth .WIDth;
72 73 74 Storyboard Progressstoryboard { get { return (GetTemplateChild( Progressstoryboard Storyboard); } }
75 76 Rectangle Progressbar { Rectangle); } }
77 78 protected Size ArrangeOverrIDe(Size finalSize)
79 80 Size s .ArrangeOverrIDe(finalSize);
81 82 .IsNaN(horizontalThumb.WIDth) (horizontalThumb.ActualWIDth ))
83 84 horizontalThumb.WIDth horizontalThumb.ActualWIDth;
85 86 87 .IsNaN(horizontalThumb.Height) (horizontalThumb.ActualHeight 88 89 horizontalThumb.Height horizontalThumb.ActualHeight;
90 91 92 .IsNaN(horizontalThumb.WIDth)) horizontalThumb.WIDth horizontalThumb.Height;
93 .IsNaN(horizontalThumb.Height)) horizontalThumb.Height horizontalThumb.WIDth;
94 95 (s);
96 97
98 OnMoveThumbToMouse( 99 100 e.Handled 101 Point p e.Getposition( );
102 103 .OrIEntation == OrIEntation.Horizontal)
104 105 Value (p.X - / 2 )) (ActualWIDth horizontalThumb.ActualWIDth) * Maximum;
106 107 108 RoutedPropertyChangedEventHandler 109 110 (handler )
111 112 handler( 113 114 115 116 DragCompleted( 117 118 dragtimer.Stop();
119 120 121 122 123 dragSeekJustFired))
124 125 .Value));
126 127 128 }
而Spinner控件,是一个载入标识,当音频载入时,会显示该控件。该控件为Path绘制的控件,这里不再贴出代码描述。
2. 获取音频文件信息部分
该部分我们同样也创建一个自定义控件来实现,TrackInfo.xaml,主要是负责在客户端显示音频文件的信息,而Silverlight没有相关API可以实现读取音频文件的标签信息,这里,我们需要引入一个微软开源类库Taglib。该类库的主要功能就是读取和修改音乐文件的标签信息。
其调用方法非常简单:
获取标签
2 Tags Taglib.file.Create(Mediafile.ID);3 设置标签属性 4 Mediafile.Artist Tags.Tag.FirstPerformer;
5 Mediafile.Title Tags.Tag.Title;
6 Mediafile.Album Tags.Tag.Album;
7 Mediafile.Genre Tags.Tag.FirstGenre;
当音乐标签信息获取成功后,即可将信息绑定到TrackInfo.DataContext。
3. 唱片图片信息
对于唱片的图片信息,这里需要读取Image从本地目录,当没有唱片图片时,则显示默认Music.png图片。这里需要注意的是,读取本地文件,需要OOB应用权限信任。
ImageSource albumartStreamBitmAPImage image;
string .IsNullOrEmpty(albumartPath))
_default)
{
_default BitmAPImage( Uri( ../Images/Music.png }
14 image _default;
15 16 17 18 fileStream stream file.Open(albumartPath, fileMode.Open, fileAccess.Read);
19 20 BitmAPImage();
21 image.SetSource(stream);
22 stream.Close();
23 24 25 image;
26 27 4. 获取音频文件列表
从演示图片可以看出,我们的音频文件列表,是用了一个绑定了音乐播放文件信息的DatagrID。
其代码非常简单,创建两列,分别绑定歌手和歌曲名:
data:DataGrID ="playList" 2 GrID.Row ="1" 3 GrID.Column 4 GrID.rowspan ="3" 5 VerticalAlignment ="top" 6 margin ="4" 7 Height ="296" 8 Style =" {StaticResource DataGrIDStyle} " 9 autoGenerateColumns ="False" 10 CanUserResizeColumns ="True" 11 CanUserSortColumns 12 SelectionChanged ="playList_SelectionChanged" > data:DataGrID.Columns data:DataGrIDTextColumn header ="歌手" 15 Binding {Binding Artist} 16 FontSize ="12" /> ="歌名" 18 {Binding Title} 19 20 WIDth ="*" </ data:DataGrID >而后台,在读取了My Music目录后,将数据集绑定到datagrID.ItemsSource就可以正常实现歌曲列表了。
static List Mediafile GetMediafiles()List files ; ;
Mediafile mf;
path Environment.GetFolderPath(Environment.SpecialFolder.MyMusic);
IEnumerable List Directory.Enumeratefiles(path,0)">*.mp3 Taglib.file Tags;
files GetCachedList(List);
|| files.Count files ();
foreach file in List)
mf Mediafile();
mf.ID file;
mf.albumartPath GetalbumartPath(file);
files.Add(mf);
for int IDx ; IDx files.Count; IDx ++ files[IDx];
Tags Taglib.file.Create(mf.ID);
mf.Artist mf.Title mf.Album mf.Genre Tags.Tag.FirstGenre;
28 29 SaveCachedList(files);
30 31 32 files;
33 在绑定成功后,同时,我们支持用户选择指定音乐播放,使用DatagrID的SelectionChanged事件即可。
playList_SelectionChanged(
DataGrID dg (sender DataGrID);(dg.Selectedindex _NowPlaying)
me.Autoplay OpenAndplay(dg.Selectedindex);
5. UI控制
对于UI的控制,这里我们只是简单的实现了隐藏和显示音乐信息框的功能,其代码实现:
Minimize_Click(
Window main Application.Current.MainWindow;_min)
main.Height 40 rot.Angle 340 180 _min _min;
}
上面是OOB音乐播放器5个部分的核心功能代码,这里,我想同时将上一篇讲到的Notifications窗口应用到实例中,我们可以仍旧使用NotificationControl文件,在其中对播放音乐Title进行绑定,即当音乐播放完毕后,即d出消息提示播放下一首“XXX”音乐。效果如下图:
根据上一篇介绍Notifications窗口的代码,我们简单进行修改,即可实现本篇实例需求:
NotificationWindow notifyWindow ShowToast()
notifyWindow NotificationWindow();
(notifyWindow.Visibility Visibility.Visible)
notifyWindow.Close();
NotificationControl myNotify NotificationControl();
myNotify.DataContext _playList[_NowPlaying];
notifyWindow.WIDth 300 notifyWindow.Height notifyWindow.Content myNotify;
notifyWindow.Show( 10000 至此,一款基于Silverlight的Out of browser模式的音乐播放器基本完成了。大家可以根据该实例添加更多自定义功能,例如添加互联网音乐播放功能,音乐搜索功能等,创建属于自己的Silverlight版酷我音乐盒。
本篇源代码下载
欢迎大家加入"专注Silverlight" 技术讨论群:
32679955(六群) 23413513(五群) 32679922(四群) 100844510(三群) 37891947(二群) 22308706(一群) 总结以上是内存溢出为你收集整理的Silverlight实例教程 - Out of Browser音乐播放器全部内容,希望文章能够帮你解决Silverlight实例教程 - Out of Browser音乐播放器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)