原文 http://10rem.net/blog/2008/07/04/how-to-resize-a-silverlight-2-app-and-keep-the-same-aspect-ratio
<
UserControl
x:Class
="PeteBrown.SilverlightScalingExample.Page"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
>
< Grid x:Name ="LayoutRoot"
Background ="Cornsilk" ShowGridLines ="True"
Width ="400" Height ="300"
RenderTransformOrigin ="0.5 0.5" >
< Grid.RenderTransform >
< ScaleTransform x:Name ="PageScale" ScaleX ="1" ScaleY ="1" />
</ Grid.RenderTransform >
…
</ Grid >
</ UserControl >
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
>
< Grid x:Name ="LayoutRoot"
Background ="Cornsilk" ShowGridLines ="True"
Width ="400" Height ="300"
RenderTransformOrigin ="0.5 0.5" >
< Grid.RenderTransform >
< ScaleTransform x:Name ="PageScale" ScaleX ="1" ScaleY ="1" />
</ Grid.RenderTransform >
…
</ Grid >
</ UserControl >
public
partial
class Page : UserControl
{
// this is the aspect ratio we want to maintain
// you can specify this all sorts of ways, but the
// easiest is to take the original size and divide
// X by Y (4:3 or 1.333 in this case)
private const double _originalWidth = 400;
private const double _originalHeight = 300;
private const double _originalAspectRatio =
_originalWidth / _originalHeight;
public Page()
{
InitializeComponent();
// wire up the event handler. This is a great addition
// to silverlight, as you used to have to hook into the
// browser event yourself
SizeChanged += new SizeChangedEventHandler(Page_SizeChanged);
}
void Page_SizeChanged( object sender, SizeChangedEventArgs e)
{
if (e.NewSize.Width < _originalWidth ||
e.NewSize.Height < _originalHeight)
{
// don't shrink
PageScale.ScaleX = 1.0;
PageScale.ScaleY = 1.0;
}
else
{
// resize keeping aspect ratio the same
if (e.NewSize.Width / e.NewSize.Height > _originalAspectRatio)
{
// height is our constraining property
PageScale.ScaleY = e.NewSize.Height / _originalHeight;
PageScale.ScaleX = PageScale.ScaleY;
}
else
{
// either width is our constraining property, or the user
// managed to nail our aspect ratio perfectly.
PageScale.ScaleX = e.NewSize.Width / _originalWidth;
PageScale.ScaleY = PageScale.ScaleX;
}
}
}
}
{
// this is the aspect ratio we want to maintain
// you can specify this all sorts of ways, but the
// easiest is to take the original size and divide
// X by Y (4:3 or 1.333 in this case)
private const double _originalWidth = 400;
private const double _originalHeight = 300;
private const double _originalAspectRatio =
_originalWidth / _originalHeight;
public Page()
{
InitializeComponent();
// wire up the event handler. This is a great addition
// to silverlight, as you used to have to hook into the
// browser event yourself
SizeChanged += new SizeChangedEventHandler(Page_SizeChanged);
}
void Page_SizeChanged( object sender, SizeChangedEventArgs e)
{
if (e.NewSize.Width < _originalWidth ||
e.NewSize.Height < _originalHeight)
{
// don't shrink
PageScale.ScaleX = 1.0;
PageScale.ScaleY = 1.0;
}
else
{
// resize keeping aspect ratio the same
if (e.NewSize.Width / e.NewSize.Height > _originalAspectRatio)
{
// height is our constraining property
PageScale.ScaleY = e.NewSize.Height / _originalHeight;
PageScale.ScaleX = PageScale.ScaleY;
}
else
{
// either width is our constraining property, or the user
// managed to nail our aspect ratio perfectly.
PageScale.ScaleX = e.NewSize.Width / _originalWidth;
PageScale.ScaleY = PageScale.ScaleX;
}
}
}
}