拖动MediaPlay控件的滚动条来控制媒体播放--silverlight(银光)学习(4)

     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

转载于:https://www.cnblogs.com/wangergo/archive/2007/10/15/925487.html

内容概要:本文档介绍了一个多目标规划模型,该模型旨在优化与水资源分配相关的多个目标。它包含四个目标函数:最小化F1(x),最大化F2(x),最小化F3(x)和最小化F4(x),分别对应于不同的资源或环境指标。每个目标函数都有具体的数值目标,如F1的目标值为1695亿立方米水,而F2则追求达到195.54亿立方米等。此外,模型还设定了若干约束条件,包括各区域内的水量限制以及确保某些变量不低于特定百分比的下限。特别地,为了保证模型的有效性和合理性,提出需要解决目标函数间数据尺度不一致的问题,并建议采用遗传算法或其他先进算法进行求解,以获得符合预期的决策变量Xi(i=1,2,...,14)的结果。 适合人群:对数学建模、运筹学、水资源管理等领域感兴趣的科研人员、高校师生及从业者。 使用场景及目标:①适用于研究涉及多目标优化问题的实际案例,尤其是水资源分配领域;②帮助读者理解如何构建和求解复杂的多目标规划问题,掌握处理不同尺度数据的方法;③为从事相关工作的专业人士提供理论参考和技术支持。 阅读建议:由于文档涉及到复杂的数学公式和专业术语,在阅读时应先熟悉基本概念,重点关注目标函数的具体定义及其背后的物理意义,同时注意理解各个约束条件的设计意图。对于提到的数据尺度不一致问题,建议深入探讨可能的解决方案,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值