
常用软件类: |
|杀毒安全 | |联络聊天 | |网络软件 | |多媒体类 | |系统工具 | |图形图像 | |系统工具 | |应用软件 | |行业软件 |
开发设计类: |
|动画制作 | |图像处理 | |3D设计 | |操作系统 | |站长学院 | |网络相关 | |WEB设计 | |数据库类 | |程序开发 |
不过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(); } |