Silverlight的内存回收存在问题?

写了个程序,由于动态New出来的对象比较多,被发现有少量的内存泄露问题。仔细找了好几圈,确认所有引用都被释放了,但问题依然存在。后来仔细观察发现,即使是一个简单的按钮事件:鼠标移进去变色,移出来恢复原来的颜色,这样的情况下内存也会持续增长,尽管增长幅度不尽相同。

于是写了个简单的测试程序,有两个按钮:点击Add按钮,动态new出8000个Ellipse,大小为10*10,半透明;点击Delete按钮,从界面上移除这8000个Ellipse,使用Children.Clear()方法。经测试发现,每次Add以后,再Delete,内存只有极少量的回收(估计是从界面渲染上回收的),而每次Add之后内存增长都在10兆到20兆。测试代码如下:

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

其实BrowserHost.Resize好像有个BUG

其实这个问题也不是我先发现的。一个月以前,做了个东西,有人用着用着问我为什么出现这样的情况:横着改变窗口大小的时候,视频大小会跟着改变而且会保持居中,播放控制栏的位置也会跟着改变(保持底部水平居中),但是垂直改变窗口的大小时,视频大小和位置都不变,播放控制栏的位置也不变。后来发现这个可能是BrowserHost.Resize的一个bug:垂直方向改变窗口大小时不会触发这个事件,不过我只测试了IE6和IE7下的情况,Firefox尚未测试。

不知道有木有人报告这个bug………

Silverlight中Path的Data属性中命令大小写的区别

在Silverlight 1.0的SDK中说L和l是一样的,没有说有什么差别,今天偶然发现大写的L命令和小写的l命令是有区别的,后来依次测试V和v、H和h、A和a、C和c、Q和q等一系列命令都存在同样的区别。

一个简单的示例如下:


如果没有区别,这两条折线的形状应该是一模一样的,而实际上它们是这样的:

如果觉得不够明显,可以看这个:



后继续测试发现,如果使用大些命令时,不会改变坐标参照系,后面的坐标仍然是以父级Canvas的原点为原点,即所有的坐标都是相对于父级Canvas的,与上一个命令的坐标(笔触的当前位置)无关;而使用小写命令,则会改变坐标参照系,后面的坐标则是以上一个命令执行的坐标为原点,即以上一个命令的坐标(笔触的当前位置)为原点的。

在第一个示例中,使用H 50命令后,坐标系原点不变,此时终点的坐标是相对父级Canvas的(40,50)位置(与上一个命令无关),直线长度为50(终点的x坐标)-40(起点的x坐标)=10;在使用h…

Silverlight直接从1.1 Alpha跳到2.0 Beta?

ScottGu’s Blog上看到这样一篇文章:.NET Web Product Roadmap (ASP.NET, Silverlight, IIS7) “.NET Web Product Roadmap (ASP.NET, Silverlight, IIS7)

文中提到Silverlight将在2008年第一季度发布2.0 Beta版,同时也会发布Silverlight 2.0 Tools for Visual Studio 2008,能够用于VS 2008标准版(Standard)、专业版(Professional)以及Express版。

从Silverlight 1.1到Silverlight 2.0,必将供许多新的功能,其中有很多是期待已久的。这些功能包括:

  • WPF UI框架支持

包括可扩展的控件框架muban、布局管理支持、双向数据绑定、以及控件模板和皮肤支持。

  • 丰富的控件

终于不用那么麻烦了,在Silverlight中将包括许多新的控件,包括:核心表单控件(textbox、checkbox、radiobutton等)、内建布局管理控件(StackPannel、Grid等)、常用功能控件(TabControl、Slider、ScrollViewer、ProgressBar等),以及数据操作控件(如DataGrid等)。…

让Silverlight User Control接收键盘消息

昨天说Silverlight User Control不能接收键盘消息,但是Page.xaml是可以接收键盘消息。既然Page能够接收键盘消息,那么我们就可以用Page来接收消息,然后想办法转发给User Control页面就行了。一个简单的实现方法就是利用C#中的delegate来实现。

简单的例子如下:
1、先在Page.xaml.cs中声明一个delegate类型以及一个该类型的变量,其参数和KeyboardEventHandler的参数一样,这样就可以直接把事件传过去了;

public delegate void SubKeyBoardEventHandler(object sender, KeyboardEventArgs e);
public SubKeyBoardEventHandler subKeyHandler = null;

2、在Page.xaml.cs中监听键盘消息:

this.KeyDown += new

Silverlight User Control不支持接收键盘事件?

Page.xaml里面的元素是可以接收键盘事件的,本来以为User Control页面也支持键盘事件的,结果在User Control的页面里加上了一行这样的代码:

this.KeyDown += new KeyboardEventHandler(UC_KeyDown);

当加载这个User Control时,发现这个User Control就显示不出来了,而注释掉就可以正常显示。后来试着在Page.xaml.cs里写这样的代码:

UC uc = new UC();
uc.KeyDown += new KeyboardEventHandler(uc_KeyDown);
this.Children.Add(uc);

发现还是无法显示出来,而注释掉那一行KeyDown事件就没有什么问题,莫非Silverlight User Control真的不支持键盘事件?

不过即使是这样也还是有办法转发键盘消息的,请看解决办法:
Continue Reading

Silverlight 1.1 Tools for Visual Studio 2008

今天从Feeds里面看到了,我大叫一声:“我终于可以重装系统了!”很早以前就说要重新装一个英文版的系统,时间期限就是等Visual Studio 2008出来,然后2008出来一个星期了,我依然不能重装系统,因为Silverlight Tool还没有出来,现在终于出来了!

Silverlight 1.1 Tools for Visual Studio 2008 功能和for VS 2008 Beta 2的功能基本一致:

  • VB and C# project templates for Silverlight 1.1 development
  • XAML markup editing with colorization and intellisense
  • Intellisense against XAML elements in VB and C# code-behind files
  • Consumption of Silverlight 1.1 components inside Web Application

Silverlight对MMS的支持并不好

发现自己又错了,才发现Silverlight 1.1 Alpha对MMS协议支持并不完善,仅仅只是能播放和消耗极少的内存而已,而对于流媒体播放的一些事件开始变得奇怪。

播放MMS流时,只是有播放缓冲,即缓冲百分比和下载百分比会迅速变成100%,随即开始播放,而更奇怪的是,当播放一个自动换头的MMS流时,其播放状态不再是和HTTP流一致。在HTTP流中,在换头时,有播放事件Media Ended,而播放MMS流结束后并不会触发这个事件,而是把播放状态(Current State)改变为Paused,此时若在程序中更改MMS流的地址,则会触发一个Media Ended事件。

另外,对于MMS和HTTP流的支持,在Silverlight 1.0的SDK中是这么说的:

Streaming
In addition to progressive downloads, MediaElement supports live and on-demand

Silverlight中XmlReader解析XML的流程

在Silverlight 1.1中,C#只能用XmlReader这样一个非常轻量级的东西来解析XML,因此稍有不慎就会出现很多非常奇怪的错误,在这里对XML的解析做一个简单的流程介绍吧。

在对流式XML的解析中,XmlReader对XML节点进行一些区分,这些节点的类型包括:

public enum XmlNodeType
{
None = 0,
Element = 1,
Attribute = 2,
Text = 3,
CDATA = 4,
EntityReference = 5,
Entity = 6,
ProcessingInstruction = 7,
Comment = 8,
Document = 9,
DocumentType = 10,
DocumentFragment = 11,
Notation = 12,
Whitespace = 13,
SignificantWhitespace = 14,
EndElement = 15,
EndEntity = 16,
XmlDeclaration

这就是PPStream的概念版网络电视?


点这里查看演示

用Silverlight做的,当然了,它真的只是个概念版,无论点哪个节目看的都是同一个视频,看到的都是相同的节目信息,貌似只是简单地请求服务器上的一个视频文件而已。

可能PPStream正在为此而努力吧?

PS:在观看之前可能会要下载部分东西,不明白是干什么用的,又没有启动P2P模块………