在Silverlight 1.1中,使用中文字体时需要使用Downloader从服务器上下载字体(具体请参考这篇文章:在Silverlight中使用中文)。在Silverlight 2中,据说是可以读取系统字体了,都以为可以不用再这么复杂地从服务器上下载字体了。结果有人发现放出来的2.0的Beta版本中无论设置什么字体都只能显示微软雅黑字体(针对中文)。
不过在Silverlight 2中提供了一种更简单的设置字体的方式,不用写长长的Downloader代码了,你只需要这样:
<TextBlock FontFamily="simsun.ttc#SimSun">这个是宋体</TextBlock>
在编译的时候会自动把相关字体打包成XAP文件放在ClientBin目录下,看起来是不是非常的简单?
通过使用这样的方式:
<file location>#<font-name>
Silverlight会自动创建一个Downloader去下载相应的文件,并设置字体。和Silverlight 1.1中一样...
在异步加载图片的时候发现的问题,因为要加载很多不同的图片,每次加载一个都要new一个Downloader,结果发现句柄数一直不停地往上冒。后来写了个简单的测试程序,发现每次new一个Downloader,就会增加三个句柄左右,但并不回收。后来改变个方式,重复使用同一个Downloader,发现句柄数在增加一次后就一直不变了。看来和以前说的Silverlight内存回收属于一样的问题,现在就只能使用方法绕过去了,尽量重复使用Downloader,不要new新的Downloader。
比如使用一个Downloader池,一个简单的Downloader Pool应该有两个List和两个方法,两个List分别用来管理工作中的Downloader和空闲的Downloader,一个方法用来提供空闲的Downloader,另外一个方法用来回收已经用完的Downloader。注意,若使用下面的这种代码,需要在回收Downloader时同时去掉Downloader上所附加的托管事件(使用“-=”操作符),你也可以把Downloader的事件封装在这个Downloader Pool类里面~
public class DownloaderPool
{
……
……
private List<Downloader> IdleDownloader = new List<Downloader>();
private List<Downloader> BusyDownloader = new List<Downloader>(...
写了个程序,由于动态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();
addNew.MouseLeftButtonUp += new MouseEventHandler(addNew_MouseLeftButtonUp);
delAll.MouseLeftButtonUp += new MouseEventHandler(delAll_MouseLeftButtonUp);
}
其实这个问题也不是我先发现的。一个月以前,做了个东西,有人用着用着问我为什么出现这样的情况:横着改变窗口大小的时候,视频大小会跟着改变而且会保持居中,播放控制栏的位置也会跟着改变(保持底部水平居中),但是垂直改变窗口的大小时,视频大小和位置都不变,播放控制栏的位置也不变。后来发现这个可能是BrowserHost.Resize的一个bug:垂直方向改变窗口大小时不会触发这个事件,不过我只测试了IE6和IE7下的情况,Firefox尚未测试。
不知道有木有人报告这个bug……
2007-12
在Silverlight 1.0的SDK中说L和l是一样的,没有说有什么差别,今天偶然发现大写的L命令和小写的l命令是有区别的,后来依次测试V和v、H和h、A和a、C和c、Q和q等一系列命令都存在同样的区别。
一个简单的示例如下:
<Path Stroke="Blue" Data="M 40,20 V 50 H 50 l 60,60" />
<Path Stroke="Red" Data="M 40,20 V 50 h 50 l 60,60" Canvas.Top="100" />
如果没有区别,这两条折线的形状应该是一模一样的,而实际上它们是这样的:

2007-11
从ScottGu's Blog上看到这样一篇文章:.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等)...
2007-11
昨天说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 KeyboardEventHandler(Page_KeyDown);
3、这个键盘事件Handler要写成这样...
2007-11
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真的不支持键盘事件?
Processed in 0.32823 second(s) , unknow queries
Powered by OWord V0.1, Even Not Alpha
(此博客程序为半成品,请勿索取,以免给您的心灵造成创伤^_^)
鄂ICP备05026031号
2007-12
用户中心
日志分类

最新日志
最新评论
统计信息






友情链接