2007年6月18日

关于 silverlight 中媒体下载进度和鼠标事件问题

The ploblems of media download progress and Mouse events in Microsoft Silverlight

在之前开发nebula silverlight media player 遇到了一些比较奇怪的问题,在此标记一下。

媒体下载进度问题。

像我所知道的那样,开发一个播放器,一般来说需要一个timer,在Silverlight中你可以像Joe描述的那样用Storyboard这控件来代替,用法就像Javascript中window.setTimeout 方法一样,一般来说用timer和流媒体下载部分及总大小可以安全地有效地控制Buffer和Play进度问题。但是在Silverlight这些工作已经被“内置”了,使用MediaElement有几个个事件和属性(BufferingProgressChanged, DownloadProgressChanged,BufferingProgress, BufferingTime, DownloadProgress),用事件驱动的方式就能进行控制下载进度的问题了。

但是实际情况不是想像中那样顺利,Buffer似乎在未下载完的和播发的交叠点就进行了,DownloadProgressChanged 事件也不像msdn描述的那样当 DownloadProgress 变化时就触发。

我的暂且方法是像在flash中那样用我们使用前面描述的“timer”来监控DownloadProgress,因为DownloadProgress对下载进度的描述还是准确的。

鼠标事件问题。

msdn对CaptureMouse的条件进行如下描述

  • The mouse is over the Silverlight control client area.
  • No other Silverlight object has captured the mouse.
  • No other non-Silverlight object has captured the mouse.
  • The left mouse button must be in a depressed state.

哦,是的,只有当鼠标在Silverlight之上才有意义。当我们进行一个DragDrop时,当鼠标离开Silverlight控件时,我们就会丢失这个事件。我不得不说这没有Flash处理的好,在Flash中你只需要对stage对象增加鼠标事件句柄就可以对Html的鼠标事件也进行捕捉。

我们需要这样的功能,因为无论Silverlight还是Flash都是在浏览器中,大多不是全屏的。对于这个问题,我还没有太好的解决方法,一旦发现会马上放出。

最后由于Silverlight还是处于Beta的阶段,也许以后会有变动。

1 条评论:

匿名 说...

you have a wonderful site!