原文 http://10rem.net/blog/2008/07/04/how-to-resize-a-silverlight-2-app-and-keep-the-same-aspect-ratio
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>
{
// 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;
}
}
}
}