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

简介: 原文: 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);
            }
        }


看看效果。看看效果。

 

纵向。

 

 

横向。

 

目录
相关文章
|
IDE 关系型数据库 开发工具
使用Visual Basic进行Windows窗体开发
【4月更文挑战第27天】本文介绍了使用Visual Basic进行Windows窗体(WinForms)开发的步骤,从搭建开发环境到创建、设计用户界面,再到编写事件驱动的代码和数据绑定。Visual Basic结合WinForms提供了一种易学易用的桌面应用开发方案。通过调试、优化、部署和维护,开发者可以构建专业应用程序。随着技术发展,掌握最新UI设计和开发工具对于保持竞争力至关重要。本文为初学者提供了基础指导,鼓励进一步探索和学习。
419 0
|
11月前
|
Ubuntu Linux Python
如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发
如何在WSL(Windows Subsystem for Linux)的Ubuntu环境中使用conda虚拟环境来为Windows上的PyCharm开发设置Python解释器。
1252 1
|
11月前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
441 0
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
332 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
编解码 开发工具 Android开发
Windows平台RTMP推送|轻量级RTSP服务如何实现摄像头叠加到屏幕输出
大牛直播SDK采用先进的图层概念实现视频叠加,如将摄像头画面实时叠加到屏幕输出,以C#为例展示了具体的配置方法。用户可在推送RTMP或启动RTSP服务前选择“摄像头叠加到屏幕”的选项,并调整位置。SDK还支持摄像头的开启与关闭、水平垂直翻转及旋转等功能。此外,该SDK提供了丰富的特性,包括但不限于视频和音频采集处理、硬编码与软编码支持、多实例推送、水印添加、网络适应性调整等,几乎涵盖了RTMP推送的所有常规需求,并能与播放器协同工作达到毫秒级的低延迟,非常适合无纸化同屏、智慧教室等应用场景。
206 4
|
12月前
|
存储 安全 程序员
Windows任务管理器开发原理与实现
Windows任务管理器开发原理与实现
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
686 0
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
1388 0
|
编解码 开发工具 数据安全/隐私保护
如何快速实现Windows平台屏幕摄像头采集并推送RTMP|轻量级RTSP服务能力?
一个好的推送模块,除了实现高效率的编码传输外,还要有好的音视频采集机制和灵活的架构支持,便于后期功能扩展,比如实时快照、预览、实时录像等。除此之外,还要有好的交互机制(比如envent callback)、低延迟和长期运行稳定的性能。
269 0
|
Windows
LabVIEW启用/禁用Windows屏幕保护程序
LabVIEW启用/禁用Windows屏幕保护程序
197 4
LabVIEW启用/禁用Windows屏幕保护程序