在Silverlight中实现定时器功能

上次写了一篇WPF中的定时器类,那个定时器类在Silverlight中也被精简下岗了(还有许多常用的方法或被精简了或直接下岗了,使用起来远没有WPF方便……),定时器还得用,而Timer类实在是不好用(都是因为线程……),只有另想办法了。有个不错的方式,通过Storyboard来实现,把Storyboard的时间设置为一秒,然后在这个Storyboard结束后进行你想要的操作,同时重新开始这个Storyboard,那么这就相当于一个一秒的定时器了,方法很巧。实现代码如下:

loopTimer = new Storyboard();
loopTimer.Duration = TimeSpan.FromSeconds(1);
loopTimer.SetValue(Storyboard.NameProperty, “looptimer”);
this.Resources.Add(loopTimer);

在Silverlight中使用中文

前面的操作方法请参考此文:http://silverlight.cn/forums/thread/549.aspx

我使用的是方案二:

* 首先使用Word或者写字板应用程序,使用您中意的字体输入你的Silverlight中所需要的文字;
* 然后在Word或者写字板当中选择“打印”功能,打印机选择Microsoft XPS Document Writer(在您安装了.NET 3.0 Framework)后会自动增加;
* XPS Document Writer本身是一个打印到文件功能,在其文件选择框中选择文件路径,并且给出相应的文件名;
* 打印完成后,在文件浏览器中找到完成的XPS文件,并且将其后缀名由”.xps”修改为”.zip”;(其实微软的好多文件格式目前都使用了ZIP格式,比如Office 2007中的DOCX、PPTX、XLSX等等,都可以将名字改为ZIP后缀名,并且使用WinZip或者其它文件压缩程序打开)

Silverlight与Flash相比几大缺点

Silverlight是微软正在推广的专门针对Flash的一个浏览器插件,被众多人誉为“Flash”杀手,但从我了解的来看,Silverlight要在短期内打败Flash,并不会有那么容易。

1、跨域读取数据的问题

基于安全考虑,浏览器插件和脚本都是不可以跨域的,Silverlight亦是如此(Silverlight在读取视频文件时可以跨域)。Flash只需在需要跨域的根域下放置一个XML文件即可轻松搞定跨域问题,而Silverlight则需要通过WebService来解决,如果要用WebService,Flash同样也可以随意跨域了。

2、动画制作与设计功能不够强大

Flash在这个方面占有绝对优势,无论从动画设计还是动画编程来说,无论从轻松易用和复杂程度来说Silverlight远远不及Flash。虽然Silverlight可以利用面向对象的C#来进行编程,而AS 3也已经完全成为一种面向对象的编程预言,其语法结构与C#非常类似,Silverlight在这个方面已经没有太多的优势。…

Silverlight对视频流HTTP请求头的要求

Silverlight对视频流HTTP请求头的要求很BT,折腾了一天才发现这个问题。

Silverlight播放视频时,视频源可以是其他域的,即是可以跨域的。读取其他数据是不可以跨域的,比如XML数据等。

Silverlight是集成了Windows Media Player的解码器的,在没有安装Windows Media Player的情况下,只要安装了Silverlight就可以在Silverlight中播放WMV、ASF、MP3等格式的视频和音频文件。Silverlight 1.1 Alpha版安装包总共不到5M,是WPF的精简版,因此解码器精简的程度也可见一斑。

自己弄了个HTTP服务,HTTP响应头并不规范,但这些视频流能在Windows Media Player或者WPF下播放,却不能在Silverlight下播放。但是如果是放在IIS下则能正常播放,于是开始观察HTTP请求,看看二者有什么不一样。然后按照IIS下的HTTP请求头重写了HTTP服务,使其HTTP响应头与IIS下的一样,结果发现果然能够正常播放了!再经仔细测试,发现HTTP响应头中只要含有协议、状态和Content-Length就可以了。…

让Silverlight的大小随浏览器大小变化

当浏览器里只有一个Silverlight,没有其他内容时,我们会希望它能够自适应浏览器大小(屏幕大小),flash在解决这个问题时很为难,而用Silverlight则可以轻松解决自适应大小的问题。

首先,在你的HTML页面中,修改这一行CSS代码:

.silverlightHost { width: 640px; height: 480px; }

改为:

.silverlightHost { width: 100%; height: 100%; }

那么,你现在的Silverlight就是自适应大小的了,但是还有很多问题要解决的,比如你的背景图片大小也得跟着改变了,还有元件布局也得跟着变……因为现在Silverlight还不能像WPF那样自动布局,只能指定绝对位置。不过还好,当Silverlight大小发生变化的时候存在BrowserHost.Resize这样一个事件,我们为这个事件写一个EventHandler就好了,而当前Silverlight的尺寸大小则可以通过BrowserHost.ActualWidth和BrowserHost.ActualHeight来获取,那么手动布局也就还算方便了,不过要是能使用相对位置自动布局就更方便了,不知道Silverlight…

Silverlight使用全屏实在是简单


在网页中浏览视频,使用全屏播放往往能够给用户更好的体验,Silverlight对全屏支持很好,简单几行代码就能搞定全屏的问题。

BrowserHost对象有个属性就是IsFullScreen,设置其为True时就可以实现全屏,设置为False就可以退出全屏,默认情况下按ESC时就可以退出全屏。后来发现,按Alt+Tab也可以,^_*

简单的代码如下:

public void Page_Loaded(object o, EventArgs e)
{
//Required to initialize variables
InitializeComponent();

fullButton.MouseLeftButtonDown += new MouseEventHandler(bgRect_MouseLeftButtonDown);
}

void bgRect_MouseLeftButtonDown(object sender, MouseEventArgs

使用Web技术开发轻量级桌面应用程序

Web技术发展得越来越快,现在如火如荼的AJAX技术,丰富强劲的Flash技术,还有刚刚新生的Silverlight,无一不为Web的RIA(Rich Interactive Application)带来了更为强大方便的实现手段,极大地丰富了Web的应用方式。

在Web 2.0中,Web交互变得越来越多,越来越复杂,功能也越来越强大,于是出现了许多新的创意,甚至把桌面应用也搬到了Web上面,例如:Google就提供了在线文字处理和在线表格编辑器。更甚至于出现了不少基于Web的OS。

但是,我们不妨换一个方式想一想,为什么我们要把桌面的应用程序搬到Web上,而不把Web技术应用到我们的桌面上来?把桌面应用程序搬到Web上,固然有非常多的好处,但是,同样,使用Web技术,我们也可以更加方便了开发出更富互动的轻量级桌面应用程序,为桌面体验带来不一般的感觉。使用XUL和JavaScript开发的Joost在线流媒体播放软件带给了用户一种视频极致体验。我相信,使用Flash、使用Silverlight结合其他桌面软件开发技术,也能够带给用户不同寻常的体验。…

Beta版终究是Beta版

先是Silverlight升级不能正常使用,后来一冲动把Visual Studio也升级到了2008 Beta 2,然后把SilverlightTools也换成了对应的Alpha版本,再装了个最新的Silverlight 1.1,自以为没有什么问题了,建了个Silverlight项目,却发现找不到引用,摸索了半天,最后在网上搜到说要更新SivlerlightTools,微软不久前才发布了一个补丁,于是呼哧呼哧地跑过去下那个补丁,发现它的发布时间是8月10日,而我下载这个东西的日子恰好是8月9日!真是fz(发指)啊!

还好,网速比较快,没用多久,SilverlightTools下载下来了,按照要求,先装Silverlight 1.1,再装Silverlight Tools,好吧,总算装好了,引用也可以找到了,只是TNND写代码的时候没有代码提示和自动完成了……软件不可以fz到这种程度!

也许是我系统的问题,我们到测试服务器上也装一个吧,看会不会有代码提示和自动完成。还好安装的过程不需要人工干预,今天来看,已经装好了,嗯,还有代码提示,那好吧,我用远程控制………

用CSS在图片上再加一个小按钮

很简单的,嗯,就是要做成这样的:

用CSS,当然得用层了,就是在图片上再加一个层,用来放那个按钮,按钮又有两种方式可以放,一种是直接用图片img标签,一种是通过背景图片放上去。这里我们就用背景图片这个方式来做吧!

首先准备这样两张图片:
宽19px,高32px
宽120px,高90px

我们想想:底部要放图片,上面要放一个按钮,貌似需要用到绝对定位,那我们需要为图片再定义一个div样式,用来放图片和这个按钮,我们可以这样写:

.expdiv{
padding:4px;
width:120px;
border:1px solid #c8c8c8;
}

剩下的就是关键的把按钮放上去,在这里,按钮是一个链接,我们可以设置链接的显示方式为block,并设置其z-index值为2(只要比0大都可以),设置其宽高分别为19px和16px(我们只需要显示按钮图片的一半就可以了),那代码可以这么写:

.expbtn{
position:absolute;

Frame里的网页不能透明?

奇怪,Frame类有个Opacity属性,设置其值为0.2一点反应都没有,又貌似没有其他属性可以设置透明度,难道是bug?如果是这样,那么Frame肯定是不能实现有透明度变化的动画了……

用Google搜了一下,找到这样两个帖子:

The animation worked when applied on other elements in a test project I made, including a Frame element with just a solid red background. I think it’s just a limitation of the Frame element when rendering HTML. It uses the WebBrowser control which is just a wrapper around the MSHTML ActiveX control, I believe.

Hmm, it might be fun to write