手把手玩转win8开发系列课程(26)

这节我们两个议题①在源代码中改变平铺②在xaml中改变平铺样式

(1)在源代码中改变平铺

这个平铺系统中最核心的是windows中的ViewStateChanged事件。为了处理事件,你可以重新配置的你的程序,来生成这个事件。下列是源代码所示:

using Windows.UI.ViewManagement;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace MetroGrocer.Pages {
//DetailPage类
 public sealed partial class DetailPage : Page {
   public DetailPage() {
     this.InitializeComponent();
// ViewStateChanged 事件 ApplicationView.GetForCurrentView().ViewStateChanged
    += (sender, args) => {
       HandleViewStateChange(args.ViewState);
  };
  }
//处理HandleViewStateChange事件
  private void HandleViewStateChange(ApplicationViewState viewState) {
   if (viewState == ApplicationViewState.Snapped) {
       GridLayout.ColumnDefinitions[0].Width
           = GridLengthHelper.FromPixels(0);
   } else {
       GridLayout.ColumnDefinitions[0].Width
           = GridLengthHelper.FromValueAndType(1, GridUnitType.Star);
   }
  }
 }
}

处理这个事件是传递这个ApplicationViewStateChangedEventArgs对象,他的Viewstate属性是来自于ApplicationViewState这个迭代器。描述这个当前平铺的对象。这个迭代器是抢购,填充,全屏水平模式和全屏风景模式。这两个模式允许看全屏模式的差异。

这个HandleViewStateChange事件是用来适应布局方式,如果这个app是在断裂模式下显示,我把第一行的宽度设置是0. 恢复全屏状态下,他的状态不能自动更新。你也需要用源代码处理状态。 这些状态是除了断裂状态。因此,我重置列的宽度。下图,你也可以看到断裂实现他们之间的状态的变化。

 

(2)在xaml中改变平铺样式

你可以在xaml中改变平铺样式,你也发现xaml语法是冗长。因此,他是很难阅读,他也很难处理,因此在真正的开发中,我也推荐你用插入code approach的方法、 但这里我用的是xaml,下图是xaml的源代码。

特别提醒,想什么VisualStateManager类别,是wpf中和silverlight中的标准的类,我这里没有提及,你要用心的学习较完全的xaml语言请看具体的wpf文档。

这里,源代码如下所示:

1 <Page
 2  x:Class="MetroGrocer.Pages.DetailPage"
 3  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 4  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 5  xmlns:local="using:MetroGrocer.Pages"
 6  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 7  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 8  mc:Ignorable="d">
 9 <Grid x:Name="GridLayout" Background="#71C524">
10  <VisualStateManager.VisualStateGroups>
11   <VisualStateGroup x:Name="OrientationStates">
12    <VisualState x:Name="Snapped">
13     <Storyboard>
14      <ObjectAnimationUsingKeyFrames
15        Storyboard.TargetProperty="Grid.ColumnDefinitions[0].Width"
16        Storyboard.TargetName="GridLayout">
17      <DiscreteObjectKeyFrame KeyTime="0">
18       <DiscreteObjectKeyFrame.Value>
19        <GridLength>0</GridLength>
20       </DiscreteObjectKeyFrame.Value>
21      </DiscreteObjectKeyFrame>
22    </ObjectAnimationUsingKeyFrames>
23     </Storyboard>
24   </VisualState>
25   <VisualState x:Name="Others">
26     <Storyboard>
27      <ObjectAnimationUsingKeyFrames
28        Storyboard.TargetProperty="Grid.ColumnDefinitions[0].Width"
29        Storyboard.TargetName="GridLayout">
30       <DiscreteObjectKeyFrame KeyTime="0">
31        <DiscreteObjectKeyFrame.Value>
32          <GridLength>*</GridLength>
33        </DiscreteObjectKeyFrame.Value>
34       </DiscreteObjectKeyFrame>
35      </ObjectAnimationUsingKeyFrames>
36     </Storyboard>
37   </VisualState>
38   </VisualStateGroup>
39  </VisualStateManager.VisualStateGroups>
40    <Grid.RowDefinitions>
41      <RowDefinition/>
42      <RowDefinition/>
43    </Grid.RowDefinitions>
44    <Grid.ColumnDefinitions>
45      <ColumnDefinition/>
46      <ColumnDefinition/>
47    </Grid.ColumnDefinitions>
48  // …StackPanel elements removed for brevity…
49 </Grid>
50 </Page>

在上述的源代码中,我定义了两个VisualState状态,首先,我得把第一行的宽度置为0,这个状态是断裂视图状态。第二个状态,这是一个其他的视图的状态,这部分无论是xaml的源代码还是C#源代码都很冗长。

另外,我得处理ViewStateChanged事件,以至于他能进入xaml的状态,下列是处理的C#源代码

 1 using Windows.UI.ViewManagement;
 2 using Windows.UI.Xaml;
 3 using Windows.UI.Xaml.Controls;
 4 namespace MetroGrocer.Pages {
 5   public sealed partial class DetailPage : Page {
 6     public DetailPage() {
 7       this.InitializeComponent();
 8       ApplicationView.GetForCurrentView().ViewStateChanged
 9         += (sender, args) => {
10    string stateName = args.ViewState ==
11       ApplicationViewState.Snapped ? "Snapped" : "Others";
12      VisualStateManager.GoToState(this, stateName, false);
13        };
14      }
15    }
16 }

我调用了静态的VisualStateManager.GoStates使其在xaml定义的状态能够互相切换。这个方法传递的参数是当前页面对象,这一位着你进入了这个状态以后,其中间状态不会显示,直接完成状态之间的切换。最后一个参数为真的时候,代表平铺状态自由切换的时候,能够提供其动画效果。

哝——这就是这节的议程。

时间: 2024-10-24 11:20:44

手把手玩转win8开发系列课程(26)的相关文章

手把手玩转win8开发系列课程(23)

这节,我们来讨论①像程序中添加最复杂的flyout控件②创建包装类 (1)像程序中添加最复杂的flyout控件 手把手玩转win8开发系列课程(21)的时候了,我们已经把一个简单的FlyOut的文件添加到了项目中,我们觉得还不够,因此了,上节我们创建了一个复杂的控件.于是,我们来将其添加到项目中去,下列是添加这个控件的源码: 1 <!--flyouts 命名空间 指向MetroGrocer.Flyouts--> 2 <flyouts:HomeZipCodeFlyout x:Name=&q

手把手玩转win8开发系列课程(8)

这节,我们继续上节的一个议程. ①添加一个主页 现在我已经定义了一个ViewModel,我就开始整合项目.第一步就是添加主页到添加到项目中去.我明白项目为何吧页面创建为空白页面,但这个空白的页面起名字叫空白一点儿意义都没有吧,我这里需要给新页面起一个更有意义的页面.原先的空白页面,我已经吧他干掉了. 鄙人是个贱体,我更喜欢添加一些新的文件夹,使其更加的有层次.因此,我加了一个新的文件夹加做pages.在此文件夹下,我右击我添加了一个叫做list的xaml的文件. 特别提醒,如果你是xaml的一个

手把手玩转win8开发系列课程(5)

  前面第三节,我们对ui层大一统的技术--xaml技术有了一个概览.   这节中的我们正式以一个项目--食品管理程序从头到尾的开发的过程,来真真正正手把手进行win8开发.别看这是简简单单的项目,麻雀虽小,能够学win8的开发的方方面面--数据的绑定,各种各样的控件和xaml样式的引用等等.   在下图1,你会看到这个项目最终运行的效果(在模拟器中运行的). 项目的开篇介绍. 针对项目,首先,可以肯定告诉大家我写的这个项目的内容是针对程序猿们而不是对于这些设计妹妹,而且这个食品管理器不是一个完

手把手玩转win8开发系列课程(1)

win8操作系统推出一个多月了,我做win8开发也有2个多月了,也写了不少wi8开发的游戏开发的博文(这一系列我会继续的更新),在这里我准备重新推出一套win8的手把手的教程,来帮助更多人,走入win8开发的阵营. 这里我们做好一些win8前期的工作,安装win8及其对win8进行一些介绍.   Win8是由微软公司开发的,具有革命性变化的操作系统.该系统旨在让人们的日常电脑操作更加简单和快捷,主要是针对平板电脑等新一代的移动互联网操作系统,是为人们提供高效易行的工作环境Win8支持来自Inte

手把手玩转win8开发系列课程(2)

 对win8开发,上一节我们对win8进行了简单的介绍,这一节我们来瞧一瞧他的开发环境搭建.    前奏. 这里所讲的win8开发,主要是指Windows8 app store 上开发,及metro ui或叫morden ui 程序的开发.传统桌面应用程序,网站应用程序的win8开发和在win7,xp下一模一样,这里就不多做过多的赘述. 这里的开发运行环境必须是Windows8,开发工具可以用vs2012 express 版本,注意这里只能开发Windows8 app store的应用程序,下载

手把手玩转win8开发系列课程(6)

这节,揭秘工程继续. 揭秘 StandardStyles.xaml文件. common文件下所包括项目中要所使用各种各样的模板文件.如图所示: 别看这么多文件了,我这里关心StandardStyles.xaml文件,他有什么作用了,最明显的作用是这个文件包含了app.xaml中所引用的一些资源字典的数据.这些数据有究竟是什么了,我问你你看到的metro风格的窗体是哪儿规定,就是来自StandardStyles.xaml文件定义的各种各样的样式.你如果对xaml有所了解的话,一定对xaml中样式不

手把手玩转win8开发系列课程(3)

上节,我们已经搭建了他的开发环境,这节,我们对UI层大一统的技术--XAML技术进行一个概览. 先来搞清楚什么是XAML?所谓XAML是eXtensible Application Markup Language的英文缩写,相应的中文名称为可扩展应用程序标记语言,它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言.  特别提醒,xaml中含有ML两个字,因此可以看出来他属于ML(mark Language)家族,这里有必要揭秘一下他的前世今生.      在xaml出现之前,微软技术的

手把手玩转win8开发系列课程(4)

上节我们说的windows8开发主要是研究开发windowsstore程序,那么我们这节重点讨论了windows store 究竟是何物?为什么平板电脑都有什么store?并且对这几个成熟的windows store程序进行简单的演示,从而比较win8平板电脑与其他的平板电脑有什么独特的地方. windows store 程序就是软件的开发者开发好了一个程序以后,只有且必须把相应的程序上传到微软的官方市场上,才能够让大庭广众使用.为什么会推出了这种机制了.这就有必要与现在的pc的程序安装来比较.

手把手玩转win8开发系列课程(28)

这节,我们讨论两个主题 ①打破视图 ②使用瓦片和徽章来更好的用户体验 如果你把断裂视图呈现给用户,你可以恢复到一个更广泛的布局时,与用户交互的应用在某些方面.为了证明这个道理,  我添加一个按钮到viewPage页面上.下列的源代码所示: 1 <StackPanel x:Name="TopRight" Background="#70a524" Grid.Column="1" 2 Grid.Row="0"> 3 &l