如何将 Silverlight 应用程序缩放至 50% 的宽度/高度?

3
我在Windows和Xbox上使用XNA创建了一个简单的2D游戏。我正在将这个游戏移植到Silverlight 5中(在撰写本文时仍处于RC阶段),该平台支持SpriteBatch,Texture2D和我在游戏中使用的各种其他XNA好用功能。我已成功将大部分代码移植到Silverlight中,但仍在努力解决分辨率/尺寸问题。
我的原始代码和内容配置为在分辨率为1280x720的情况下运行 - 我想保持这种方式 - 但我想将Silverlight游戏嵌入网页中以获得更可管理的尺寸:640x360(其原始大小的一半)。
因此,我的问题是:如何将整个Silverlight应用程序缩小到其原始大小的50%?
我认为我正在正确的轨道上,但我还不能完全让它工作。我发现了RenderTransform和ScaleTransform XAML元素,它们似乎几乎可以实现我所需求的目标,但并不完全。我的XAML如下:
<!-- Some attributes omitted for brevity -->
<UserControl x:Class="Silverlight3dApp.MainPage"
  d:DesignWidth="1280"
  d:DesignHeight="720">

  <Grid x:Name="LayoutRoot" Background="White">
    <Grid.RenderTransform>
      <ScaleTransform x:Name="Scale" ScaleX="0.5" ScaleY="0.5" />
    </Grid.RenderTransform>
    <DrawingSurface x:Name="myDrawingSurface" Draw="myDrawingSurface_Draw" />
  </Grid>
</UserControl>

我的HTML对象长这样:

<object data="data:application/x-silverlight-2,"
  type="application/x-silverlight-2"
  width="640"
  height="360">
  <!-- etc. -->
</object>

因此,嵌入的HTML对象设置为640x360(如所需),Silverlight应用程序设置为1280x720,然后缩放为ScaleX和ScaleY的0.5。这种方法有点可行;应用程序被缩小到50%的大小,但绘制的内容被裁剪了。我只能看到左上象限,因此只能看到320x180个像素的内容(在原始尺寸下本应为640x360)。
在这个简陋的图中,“X”代表我在Silverlight嵌入对象中看到的内容,其他部分都被突然裁剪为空:
 ___________
|XXXXX      |
|XXXXX      | 360px
|           |
|___________|
    640px

我是一个 Silverlight 新手,所以我有一种感觉我错过了一些显而易见的东西。有什么想法吗?

2个回答

1

我认为,由于XNA集成的工作方式,您需要以50%的大小实际绘制。如果您使用SpriteBatch,则可以很容易地完成此操作,只需使用允许您指定矩阵的Begin重载即可:

spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend,
    SamplerState.LinearClamp, DepthStencilState.None, 
    RasterizerState.CullCounterClockwise, null, Matrix.CreateScale(.5f));

谢谢回复!在我的情况下,这真的完美地解决了问题。完成了,OK了。谢谢!我准备接受你的答案,只是稍微等一下,看看是否有一个“纯Silverlight”解决方案,可以适用于那些使用不仅仅是SpriteBatch的其他人。无论如何都给你点赞,很好的答案,谢谢。顺便问一句,你是SilverSprite的作者吗?如果是的话,干得漂亮!我昨天刚玩了一下。 - Michael
你可能想尝试将DrawingSurface包装在Canvas中,这有时可以防止Grid进行剪切。是的,我写了SilverSprite,目前正在努力使其与新的Silverlight 5兼容,项目太多,时间不够用。 - Bill Reiss

0
如果你想要变得非常懒,可以看一下ViewBox控件的工作方式。我记不清它在缩放方面是否100%可靠,但对于初学者来说应该还是可以的。我曾在生产中使用它来处理一些备用方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接