由于希望Silverlight程序在浏览器中可以随着浏览器的大小而自适应,以便给客户带来更好的体验,在网上搜索了一下代码,大概原理是:
设置SilverlightHost的大小为100%(这在Silverlight2 beta2中似乎已经自动设置了,程序的大小为640*480)
public partial class Page : UserControl
{
public Page()
{
// Required to initialize variables
InitializeComponent();
Application.Current.Host.Content.Resized += new EventHandler(BrowserHost_Resize);
}
private void BrowserHost_Resize(object sender, EventArgs e)
{
Content contentObject = Application.Current.Host.Content;
double xscale = contentObject.ActualWidth / this.Width;
double yscale = contentObject.ActualHeight / this.Height;
ScaleTransform scale = new ScaleTransform();
scale.ScaleX = xscale;
scale.ScaleY = yscale;
RenderTransform = scale;
{
public Page()
{
// Required to initialize variables
InitializeComponent();
Application.Current.Host.Content.Resized += new EventHandler(BrowserHost_Resize);
}
private void BrowserHost_Resize(object sender, EventArgs e)
{
Content contentObject = Application.Current.Host.Content;
double xscale = contentObject.ActualWidth / this.Width;
double yscale = contentObject.ActualHeight / this.Height;
ScaleTransform scale = new ScaleTransform();
scale.ScaleX = xscale;
scale.ScaleY = yscale;
RenderTransform = scale;
}
通过以前代码可以实现Silverlight程序随着浏览器的大小而变化了,可是在实际应用发现,实际上这样只能实现Silverlight程序随着浏览器变大,而不是能缩小。也就是说当浏览器的容器的大小大于Silverlight原始大小时,Silverlight程序随之变大,但当浏览器容器的大小小于Silverlight程序的原始大小时,会出现Silverlight程序显示不全的情况,如下图所示:
图1
图2
在图1中可看出,当Host的尺寸大于程序大小时,显示正常,而在图2中则消失了一部分。
经过分析,我认为是因为Rezised事件是后于浏览器大小变化而激发的,但此时浏览器已经遮挡了一部分程序画面,而Transform的变换只依靠当前显示的画面进行变换,所以出现了这种现象。
结论:我也不知道这种情况该如何处理,不晓得有没有达人知道,还请告知,谢拉。