我有一个 Silverlight 页面,我希望在纵向和横向模式下具有以下外观。本质上,三个图像排列在一个网格中。大图像跨越两列。当手机旋转时,图像会旋转,但整体布局不会。小图像保持靠近后退/窗口/搜索按钮,大图像保持在手机顶部。
我尝试了多种方法来达到这种效果,但都以某种方式证明了它们并不令人满意。我希望有人能指出我遗漏的东西,或者至少可以防止其他人不得不浪费 4 或 5 天时间得出与我相同的结论。 粗体问题:
我尝试的第一件事是将 RotateTransform 应用于 LayoutRoot 元素,并在手机旋转变为横向时将其旋转 -90 度。我不得不将布局根的高度和宽度硬编码为 800 和 400 而不是“自动”,否则它会被压扁。该解决方案几乎可以工作,但在绘制页面后会应用 RotateTransform。因为它在 800x400 屏幕上绘制为 400x800 图像,所以不会绘制顶部 200 和底部 200 像素。这在它旋转并且(现在)左右部分丢失后变得很明显。 有没有办法强制布局引擎画出屏幕,以便在应用 RotateTransform 后所有像素都在那里?
我考虑的下一件事(但没有尝试)是将页面 SupportedOrientations 设置为“PortraitOnly”,然后使用加速度计生成我自己的“OnOrientationChanged”事件,然后当手机倾斜到横向时有选择地将图像旋转 90 度. 我认为这是一个坏主意,因为当我的应用程序中的旋转方式与其他所有应用程序中的旋转方式不同时,我可能会以某种微妙的方式弄错,从而导致混乱。 有没有办法在不自动更新包含我的元素的网格布局的情况下触发 OnOrientationChanged 事件?或者,是否有其他可用于检测手机方向的钩子?
我尝试的最后一件事与此处提供的建议类似:Windows Phone 7 applications - Orientation Change和此处:http: //blogs.msdn.com/b/ptorr/archive/2010/03/27/strategies-for-dealing -with-orientation-changes.aspx。这个解决方案对我来说似乎有点脆弱,因为它迫使我在 OnOrientationChanged 事件处理程序以及 xaml 代码中更改网格行和列的相对大小。在纵向模式下,第一行设置为 5*,第二行设置为 2*。然后当我切换到横向时,每行需要设置为 1*,列需要分别设置为 5* 和 2*。或者,我可以硬编码小图像的大小并将行和列设置为自动,但我仍然坚持硬编码。由于我已经用尽了所有其他选择,我认为这是我坚持的解决方案。
我错过了什么,还是这样做的方式?