Silverlight实例教程 - Out of Browser音乐播放器

Silverlight实例教程 - Out of Browser音乐播放器,第1张

概述   在上一篇,我们了解了如何在Silverlight的Out of Browser模式下进行Debug调试,另外学习Silverlight OOB应用的一个新特性Notifications窗口。本篇,我们将结合以往的Out of Browser特性,创建一款新的Out of Browser实例, 音乐播放器。 该实例目的比较简单,实现音乐播放,实现音乐文件列表读取,实现音乐文件信息读取,另外音乐  

 在上一篇,我们了解了如何在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:MediaSlIDerlocal:Spinner

MediaSlIDer:

其功能是控制音乐播放进度,支持拖拽前进或者后退音乐播放进度。其代码如下:

  1  public class  MediaSlIDer : SlIDer
  2      {
  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 albumartStream
                BitmAPImage 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音乐播放器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1020373.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存