Windows Phone开发(6):处理屏幕方向的改变

原文:Windows Phone开发(6):处理屏幕方向的改变
俺们都知道,智能手机可以通过旋转手机来改变屏幕的显示方向,更多的时候,对于屏幕方向的改变,我们要做出相应的处理,例如,当手机屏幕方向从纵向变为横向时,可能要重新排列页面上的控件以适应显示区域的变化。

前面我们讨论过,Silverlight for Windows Phone的页面布局有三个常用的布局控件,那么,当屏幕方向改变后,我们所做的对布局的更改基础上是基于这几个容器进行的操作。

本文我将通过三个示例来分别说明。

开始之前,先说一下PhoneApplicationPage类的OrientationChanged事件,该事件就是当屏幕的方向改变之后发生,我们从事件参数OrientationChangedEventArgs类的实例的Orientation属性中获取当前屏幕的方向,即改变后的方向,比如,原来屏幕是纵向,现在我把手机屏幕改为横向,则Orientation属性获取到的方向就是横向的,呵呵,当然也包括从哪个方向旋转过来的,这里只是举例而已。

要使页面支持旋转,要把PhoneApplicationPage的SupportedOrientations属性改为PortraitOrLandscape,然后可以通过定义OrientationChanged事件来处理布局。形如:

<phone:PhoneApplicationPage 

    ..............
    SupportedOrientations="PortraitOrLandscape"
    Orientation="Portrait"
    OrientationChanged="PhoneApplicationPage_OrientationChanged">

一、Grid控件的处理。

<phone:PhoneApplicationPage
    x:Class="Sample_PageDir.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True"
    SupportedOrientations="PortraitOrLandscape"
    Orientation="Portrait"
    OrientationChanged="PhoneApplicationPage_OrientationChanged">

    <Grid x:Name="layoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <Image x:Name="img" Source="http://gubapic.eastmoney.com/member/e68/e681999/e68199920091216131540.jpg" Stretch="UniformToFill" Width="270" Grid.Row="0" Grid.Column="0" />
        <TextBlock x:Name="txtBlock"
            Grid.Row="1"
            Grid.Column="0"
            FontSize="70"
            Margin="28">
            <Run Foreground="Coral">信春哥</Run>
            <LineBreak/>
            <Run Foreground="Yellow">唱情歌</Run>
            <LineBreak/>
            <Run Foreground="SkyBlue">不挂科</Run>
        </TextBlock>
    </Grid>

</phone:PhoneApplicationPage>

页面主要有两个控件,一个用于显示图片,一个用于显示文本信息,通过事件处理代码来相应改变两个控件的布局。

        private void PhoneApplicationPage_OrientationChanged(object sender, OrientationChangedEventArgs e)
        {
            // 如果是横向的
            if (e.Orientation == PageOrientation.Landscape ||
                e.Orientation == PageOrientation.LandscapeLeft ||
                e.Orientation == PageOrientation.LandscapeRight)
            {
                Grid.SetColumn(this.img, 0);
                Grid.SetRow(this.img, 0);
                Grid.SetRow(this.txtBlock, 0);
                Grid.SetColumn(this.txtBlock, 1);
            }
            // 如果是纵向
            else if (e.Orientation == PageOrientation.Portrait ||
                e.Orientation == PageOrientation.PortraitDown ||
                e.Orientation == PageOrientation.PortraitUp)
            {
                Grid.SetColumn(this.img, 0);
                Grid.SetRow(this.img, 0);
                Grid.SetRow(this.txtBlock, 1);
                Grid.SetColumn(this.txtBlock, 0);
            }
            else
            {
                Grid.SetColumn(this.img, 0);
                Grid.SetRow(this.img, 0);
                Grid.SetRow(this.txtBlock, 1);
                Grid.SetColumn(this.txtBlock, 0);
            }
        }

按F5运行程序,默认的屏幕方向是纵向的,如下图所示:

 

好,现在,我们把屏幕旋转一下,看看会怎么样。

 

 

 

二、StackPanel控件的处理。

<phone:PhoneApplicationPage
    x:Class="Sample_PageDir.Page2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="PortraitOrLandscape"
    OrientationChanged="PhoneApplicationPage_OrientationChanged"
    Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <phone:PhoneApplicationPage.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="FontSize" Value="46"/>
        </Style>
    </phone:PhoneApplicationPage.Resources>

    <StackPanel x:Name="pl">
        <TextBlock Text="文本一"/>
        <TextBlock Text="文本二"/>
        <TextBlock Text="文本三"/>
    </StackPanel>
</phone:PhoneApplicationPage>

后台事件处理代码。

 

        private void PhoneApplicationPage_OrientationChanged(object sender, OrientationChangedEventArgs e)
        {
            if (e.Orientation == PageOrientation.Landscape ||
                e.Orientation == PageOrientation.LandscapeLeft ||
                e.Orientation == PageOrientation.LandscapeRight)
            {
                this.pl.Orientation = System.Windows.Controls.Orientation.Horizontal;
            }
            else
            {
                this.pl.Orientation = System.Windows.Controls.Orientation.Vertical;
            }
        }

运行,默认方向是纵向。

 

 

把屏幕旋转后。

 

 

三、Canvas控件的处理。

<phone:PhoneApplicationPage
    x:Class="Sample_PageDir.Page3"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="PortraitOrLandscape"
    Orientation="Portrait"
    OrientationChanged="PhoneApplicationPage_OrientationChanged"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <Canvas x:Name="cv">
        <Rectangle x:Name="rect1"
            Width="232"
            Height="238"
            Fill="Red"
            Canvas.Left="88"
            Canvas.Top="88"/>
        <Rectangle x:Name="rect2"
            Height="192"
            Width="275"
            Fill="Yellow"
            Canvas.Top="268"
            Canvas.Left="155"/>
    </Canvas>

</phone:PhoneApplicationPage>

后台代码。后台代码。

 

        private void PhoneApplicationPage_OrientationChanged(object sender, OrientationChangedEventArgs e)
        {
            if (e.Orientation== PageOrientation.Landscape||e.Orientation== PageOrientation.LandscapeLeft||e.Orientation== PageOrientation.LandscapeRight)
            {
                Canvas.SetTop(this.rect1, 37);
                Canvas.SetLeft(this.rect1, 46);
                Canvas.SetTop(this.rect2, 240);
                Canvas.SetLeft(this.rect2, 462);
            }
            else
            {
                Canvas.SetTop(this.rect1, 88);
                Canvas.SetLeft(this.rect1, 88);
                Canvas.SetTop(this.rect2, 268);
                Canvas.SetLeft(this.rect2, 155);
            }
        }

看看效果。看看效果。

 

纵向。

 

 

横向。

 

时间: 2024-09-14 13:01:29

Windows Phone开发(6):处理屏幕方向的改变的相关文章

Android开发入门(六)适应方向 6.1 屏幕方向的改变

现代手机设备的一个非常重要的特性就是可以旋转屏幕的方向.当然了,Android也不例外.Android支持 两种屏幕方向:portrait(竖屏)和landscape(横屏).默认情况下,当改变手持设备的屏幕方向时,当前 的anctivity会自动地重绘它的内容.这是因为当屏幕方向发生变化的时候,onCreate()方法被触发了. 说明:当改变设备的屏幕方向,事实上,你的当前的activity会被销毁,然后重新创建. 然 后,当views被重绘的时候,它们可能会按照之前的屏幕方向被绘制(这取决于

Windows 8风格应用开发入门 十 设备方向

常用支持Windows 8操作系统设备的方向 在我们常用的设备当中,Windows 8是通过什么来监控设备方向呢?答案是方向传感器,那么对于设备的不同方向,方向传感器都对应哪些方向值呢?如下表: 开发入门 十 设备方向-windows开发入门"> 我们可以从表中知道: 1) 设备方向为水平方向向上(Portrait Up)时,对应传感器值为NotRotated(未发生旋转): 我们可以通过对比设备中Windows按钮的位置来识别不同方向,如下图所示: 2) 设备方向为竖直方向向左(Land

背水一战 Windows 10 (2) - UI: 概述, 启动屏幕, 屏幕方向

原文:背水一战 Windows 10 (2) - UI: 概述, 启动屏幕, 屏幕方向 [源码下载] 背水一战 Windows 10 (2) - UI: 概述, 启动屏幕, 屏幕方向 作者:webabcd 介绍背水一战 Windows 10 之 UI UI 设计概述 启动屏幕(闪屏) 屏幕方向 示例1.UI 设计概述UI/Summary.xaml <Page x:Class="Windows10.UI.Summary" xmlns="http://schemas.mic

Windows服务用ScreenOrientation获得的值一直不变?怎么获得屏幕方向?

问题描述 我建了一个Windows服务项目,加了Windows.Forms的引用,然后用一个Threading.Timer每秒获取一次SystemInformation.ScreenOrientation.问题是:无论我的屏幕是哪个方向(在"屏幕分辨率"中设置的),这个东西永远返回Angle0(水平).但是如果我创建一个WinForms项目,在里面用SystemInformation.ScreenOrientation,就可以正确地根据我的屏幕方向返回Angle0.Angle90(垂直

JQuery移动页面开发之屏幕方向改变与滚屏的实现_jquery

方向改变事件(orientationchange)当设备的方向变化(设备横向持或纵向持)此事件被触发.绑定此事件时,你的回调函数可以加入第二个参数,作用为描述设备横或纵向的属性,"portrait"或;landscape".这些值也会作为class值加入到html的元素中,使你可以通过css中的选择器改变他们的样式.注意现在当浏览器不支持orientationChange事件的时候我们绑定了resize 事件. 手持设备方向改变时执行 $(window).bind( 'ori

Windows 8开发入门(二).Windows 8开发知识储备

在本文中将整理出一些Windows 8开发前需要了解的一些基础知识并且列为相应的几个表格以供大家参考, 其中部分来源于MSDN.部分来源于本人整理,如有误之处请指正,谢谢. 一.新建常用XAML项目类型 模板和各种语言的关系 项目类型名 项目类型 作用以及描述 适用语言 空白应用程序 创建一个最简化的空白XAML应用 以供用户使用,需要自己添加 界面.公共代码等. C#/VB/C++/Javascript   拆分应用布局程序 显示主从式列表,如新闻列 表 (分为很多个新闻类别,每个新闻类别 下

Windows Phone开发(19):三维透视效果

原文:Windows Phone开发(19):三维透视效果 三维效果也可以叫透视效果,所以,我干脆叫三维透视效果.理论知识少讲,直接用例开场吧,因为这个三维效果其实很简单,比上一节中的变换更省事,不信?一起来做一做练习吧. 练习一:把对象沿Y轴旋转45度. 默认情况下,旋转中心都是在中心位置上,如Y轴中心.而至于旋转的角度,哪个方向是正值,哪个方向是负值,嘿,你自己动手试一下就知道了,我相信你能理解的,不然,Hello Kitty嘲笑你的. 好的,由于是第一个练习,我们先来说说X.Y.Z三个坐标

【万里征程——Windows App开发】控件大集合2

下面再来看看一些前面还没有讲过的控件,不过控件太多以至于无法全部列出来,大家只好举一反三啦. Button 前面最常用的控件就是Button啦,Button还有一个有意思的属性呢,当把鼠标指针放在Button上时,就会在Button的头顶冒出一串文本啦.这个不太截图哎-- <Button ToolTipService.ToolTip="Go to www.blog.csdn.net/nomasp" Margin="692,458,0,230" /> Bu

【万里征程——Windows App开发】应用栏

基本的用法我们在 [万里征程--Windows App开发]页面布局和基本导航中已经讲过了,这里继续补充关于应用栏的更多用法. Icon 在之前的学习中,我们知道Icon属性中有很多很多系统预定义,但也许这些还是不够的,现在就来增加几种用法咯. 字符集应用 <AppBarToggleButton Label="Sigma" Click="AppBarButton_Click"> <AppBarToggleButton.Icon> <Fo