拖動MediaPlay控制項的捲軸來控制媒體播放–silverlight(銀光)學習(4)

來源:互聯網
上載者:User
     10.1 本打算寫完MediaPlay控制項的拖動捲軸來控制媒體播放的功能,可惜在這裡卡殼了。我的拖放進度條的效果總是不理想,至到今晚上看到一段視頻--DRAG AND DROP FUNCTIONALITY IN SILVERLIGHT 1.1才發現自己只不過少寫了一行代碼。
     不過Mediaplay控制項我不打算再寫下去了,因為微軟公司在ASPNETFutures組件包裡提供了asp:media組件,這個組件可以用在silverlight頁面裡,功能比我寫的要強大,還支援換膚。
     好了,如何通過拖動進度條來控制媒體播放呢?要用到silverlight裡MediaElement的一個屬性Position,它是一個timespan,設定它的值後就可以定位到你想要播放的時間點上。
    如果找進度條和 MediaElement 的Position之間的關係呢。我們看下面的圖:
  
   | <--              left                   --> | currentPosition: x                           |
   |<------------------------------------totalLength------------------------->|    
  
    中間捲軸的位置left和滾動槽的總長度totalLength就對應著媒體播放目前時間點Position和媒體播放完所要的總時間NaturalDuration.
    再講一個知識點:擷取所播放的媒體的總播放時間用MediaElement的NaturalDuration屬性。
   所以我們可以用這樣的公式來表示:  
   Position = (left/totalLength)*NaturalDuration

     好了,解決了一個技術點,那麼更重要的一個技術點是如何拖動捲軸呢?這涉及到三個滑鼠事件:
 MouseLeftButtonDown,MouseMove,MouseLeftButtonUp.也就是說當你用滑鼠拖放一個東西的時候,首先要按下滑鼠
左鍵,然後拖放,拖放到指定的位置後就放開滑鼠左鍵,從程式角度上講這三個事件就先後發生了。
     拖放的時候還要注意的一點是:為了捕獲滑鼠,我們要用到CaptureMouse()方法,放開滑鼠左鍵的時候我們要釋放滑鼠ReleaseMouseCapture();
     核心代碼如下:
  

//點下滑鼠左鍵

void TimeThumb_MouseLeftButtonDown(object sender, MouseEventArgs e)
{
   ((System.Windows.Media.Visual)sender).CaptureMouse();//捕獲滑鼠

    this.timelinePointStart = e.GetPosition(Parent as UIElement).X;//擷取滑鼠的x座標軸
             
    TimeLinedrag = true;//標識拖放操作開始 
 
                
 } 


//移動滑鼠
   void TimeThumb_MouseMove(object sender, MouseEventArgs e)
  {
     if (TimeLinedrag)
     {
        timelinePoinxEnd = e.GetPosition(Parent as UIElement).X;
        Double delta = timelinePoinxEnd - timelinePointStart;
                      
        double left = (double)TimeThumb.GetValue(Canvas.LeftProperty);

       timelinePointStart = timelinePoinxEnd;//我就是掉了這段代碼
                       
       this.TimeThumb.SetValue( Canvas.LeftProperty, left+delta);
                      
       }
        
   }

//放開滑鼠左鍵
 void TimeThumb_MouseLeftButtonUp(object sender, MouseEventArgs e)
        {
     
            TimeLinedrag = false;
            
           this.videoWindow.Pause();//暫停播放
            
            double left =(double)TimeThumb.GetValue(Canvas.LeftProperty);
            
            double rate = left/(this.TimeSlider.Width -this.TimeThumb.Width); //視頻拖放到新位置在整個播放進度的比率
            
            long  ticks = Convert.ToInt64(rate * this.videoWindow.NaturalDuration.TimeSpan.Ticks);
            
            this.videoWindow.Position=new TimeSpan(ticks);
           
            this.videoWindow.Play();
            
            ((System.Windows.Media.Visual)sender).ReleaseMouseCapture();
        }

   原始碼下載:/Files/wangergo/MediaPlayControlDrag.rar

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.