有没有办法找出我的方向是什么?

时间:2012-02-02 12:47:12

标签: windows-phone-7

我目前正在编写一个仅限肖像的应用程序,但我有一个客户要求他们想要实现一个特殊功能,如果手机转向它。

要明确的是他们不希望页面改变方向 - 所以保持页面作为肖像在这里运作良好 - 但他们确实希望能够检测到横向变化。

有没有找到这个(例如从rootframe或其他对象?)或者我是否必须访问Accelerometer数据并自行处理?


要清楚这一点......

  • 我一直试图让页面保持纵向。
  • 如果我指定SupportedOrientations =“portraitorlandscape”那么保持页面处于纵向状态似乎很难(如果我错了,请纠正我,但它似乎不想留在肖像中 - MS SDK也是如此擅长使页面走向风景)
  • 如果我没有指定SupportedOrientations =“portraitorlandscape”,那么我不会在页面或RootFrame中调用OnOrientationChanged

作为锦上添花......我需要手机保持纵向模式 - 我需要SystemTray保持在屏幕顶部(肖像顶部)。

4 个答案:

答案 0 :(得分:2)

您可以处理将返回OnOrientationChanged枚举的PageOrientation事件。


因为评论而接受这个:

@Stuart - 您可能会发现此入门工具包中的Orientation Helper类非常有用。它使用加速度计,所以我猜你必须使用它,但它可以节省你推出自己版本的时间:http://msdn.microsoft.com/en-us/library/gg442298%28VS.92%29.aspx#Customizing_Behavior

答案 1 :(得分:1)

这可能会有所帮助,但对于到达此特定页面的情况,而不是初始页面的情况 - 因此只能部分回答问题。虽然没有做任何改变,但它会触发OnOrientationChanged! (在试图找到解决方案两天后找出这个解决方案):

在特定页面上,写入。 xaml代码

Orientation="None" 

在.xaml.cs方面,写下

InitializeComponent();

Orientation = this.Orientation;  
this.OrientationChanged += new EventHandler<OrientationChangedEventArgs>          
(OnOrientationChanged);

并单独

void OnOrientationChanged(object sender, OrientationChangedEventArgs e)
{
 if ((e.Orientation & PageOrientation.Landscape) != 0)
  {
            MyImage.Height = 480;  //for example
  }

        {
            MyImage.Width = 480; // for example
        }
}

就我而言,我将图像放置如下:

<Grid.RowDefinitions>
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <StackPanel>
         <Image x:Name="MyImage"/>
    </StackPanel>

..然后是其他代码,仍在加载期间图片显示...

进入页面时,在横向模式下,这会减小图像的大小!

在看过Jeff Prosises site

后,最终得到了解决方案

答案 2 :(得分:0)

答案 3 :(得分:0)

我必须在我的某个应用程序中执行类似的操作,之后用作背景的图像不会旋转,但页面上的其他项目会旋转。
代码看起来有点像这样:

    protected override void OnOrientationChanged(OrientationChangedEventArgs e)
    {
        // Keep the image in the same position as in portrait
        //  But still allows other controls to rotate when orientation changes.
        switch (e.Orientation)
        {
            case PageOrientation.LandscapeRight:
                ForegroundImage.RenderTransform = new CompositeTransform { Rotation = 90 };
                ForegroundImage.RenderTransformOrigin = new Point(0.5, 0.5);
                ForegroundImage.Margin = new Thickness(158.592, -158.792, 158.592, -160.558);

                break;
            case PageOrientation.LandscapeLeft:
                ForegroundImage.RenderTransform = new CompositeTransform { Rotation = 270 };
                ForegroundImage.RenderTransformOrigin = new Point(0.5, 0.5);
                ForegroundImage.Margin = new Thickness(158.592, -158.792, 158.592, -160.558);

                break;
            default: // case PageOrientation.PortraitUp:
                ForegroundImage.RenderTransform = null;
                ForegroundImage.RenderTransformOrigin = new Point(0, 0);
                ForegroundImage.Margin = new Thickness();

                break;
        }

        base.OnOrientationChanged(e);
    }

不幸的是,系统托盘或应用栏没有真正的解决方法。对于系统托盘,您可以隐藏它,然后仅在用户点击或滑动屏幕的那一部分时显示它(一段时间)。