wp8.1 Study9:针对不同的屏幕和手机方向调整UI

一、预备知识

  现在不同屏幕大小WP8.1手机越来越多,那么在设计UI时,这需要我们考虑这个问题。在WP中,比例因子(a scale factor)能很好的解决问题,而且在微软系统的PC/平板/手机都是这样做的。scale factor是根据物理的手机屏幕尺寸等参数计算出来的,有具体的计算公式,在这里不一一介绍。

二、什么是我们需要做的

1、提供位图图像给系统的缩放

比如在页面中,有一个Image控件来展示图像,我们为了让它在不同屏幕大小显示同样的清晰,我们需要在系统文件中提供相对应比例因子的图像给它。

步骤只有一步新建Images文件夹,把相应的图片放进去,如图:

系统会自动根据不同的设备调用不同的图像资源给页面的Image控件。

注:xaml代码为

<Image Source="/Images/resolution.png" Stretch="None" />

2、构建能够适应可用的屏幕大小的UI

(1)我们在进行页面布局时,大多数会用到Grid,此时在定义行和列时,尽量规定行和列是按相关比例放置的(不是绝对的),比如:

<Grid.RowDefinitions>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

利用*,Auto,会很有用的。

(2)使用ViewBox

ViewBox是可拉伸和缩放唯一子项并将填满可用空间的一个内容修饰器;在一些地方使用ViewBox控件,会使内容在不同的情况下更好显示。比如在手机由垂直放置变成横向放置,ViewBox里面的控件会相对应变化。例子如下:

xaml代码:

<Viewbox Grid.Row="0">
            <TextBlock x:Name="HelloTextBox" Text="This text fills in." />
        </Viewbox>

TextBlock内容将根据手机放置情况变化。

3、应对手机放置变化

如果手机支持portrait 和 landscape, 这是很必须的。举例子如下:

可以在页面中加入类似,xaml代码

 

<VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="VisualSizeStateGroup">
                <VisualState x:Name="Portrait">
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="MonaLisaDetails">
                            <DiscreteObjectKeyFrame KeyTime="0">
                                <DiscreteObjectKeyFrame.Value>
                                    <Visibility>Collapsed</Visibility>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>
                <VisualState x:Name="Landscape">
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="MonalisaImage">
                            <DiscreteObjectKeyFrame KeyTime="0">
                                <DiscreteObjectKeyFrame.Value>
                                    <x:Double>300</x:Double>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>

 

而在C#中加入:

private void DisplayInfoOrientationChanged(DisplayInformation sender, object args)
        {
            var orientation = sender.CurrentOrientation;
            if (orientation == DisplayOrientations.Landscape || orientation == DisplayOrientations.LandscapeFlipped)
            {
                var res = VisualStateManager.GoToState(this, "Landscape", true);
            }
            if (orientation == DisplayOrientations.Portrait || orientation == DisplayOrientations.PortraitFlipped)
            {
                var res = VisualStateManager.GoToState(this, "Portrait", false);
            }
        }
  public ContentOverflow()
        {
            this.InitializeComponent();
            VisualStateManager.GoToState(this, "Portrait", false);
            DisplayInformation displayInfo = DisplayInformation.GetForCurrentView();
            displayInfo.OrientationChanged += DisplayInfoOrientationChanged;
        }

其中VisualStateManager是管理状态和逻辑转换的。学习它十分有用,MSDN:http://msdn.microsoft.com/zh-cn/library/system.windows.visualstatemanager(v=vs.110).aspx

三、显示信息等查询

使用DisplayInformation类,代码如下:

DisplayInformation displayInfo = DisplayInformation.GetForCurrentView();

// NB: not all properties/events shown - take care with deprecated properties
// such as ResolutionScale
var nativeOrientation = displayInfo.NativeOrientation;
var currentOrientation = displayInfo.CurrentOrientation;
var rawPixelsPerViewPixel = displayInfo.RawPixelsPerViewPixel;
var viewPixelsDPI = displayInfo.LogicalDpi;
var rawDpiX = displayInfo.RawDpiX;
var rawDpiY = displayInfo.RawDpiY;

以上内容只是相互学习的参考内容,如有出错,请指出。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。