UWP 开发初阶 Chapter 5 - 实现页面导航,和页面内部分区域导航

上篇回顾

上篇我们了解了如何实现自适应布局。通过建立 VisualState 来实现。我们使用了其中的 AdaptiveTrigger 来激发相应的事件,而再通过 Setters 中去设置每个控件在触发事件后的新的属性。其实在 VisualState 中我们还可以通过 StoryBoard 来建立动画效果,这个今天就不做介绍了,日后会提到。

本篇正文

如何实现基本的页面导航

回顾一下:

.xaml 文件在 UWP 项目中其实就是一个页面文件,比如初次建立 UWP 项目的时候 vs 帮我们自动在根目录里面建立的 MainPage.xaml 文件。我们直接在这个文件里修改 XAML 的时候,就能看到变化,那是因为我们打开软件的时候,系统自动先导航到了 MainPage 这个页面。(初始化导航,定义在 App.xaml.cs 文件中,暂时不需要了解)

  • 实现目标:从一个页面导航到另一个页面

  • 思路:新建一个 .xaml 文件,然后在 MainPage 中添加一个按钮,点击按钮后,转到新建的页面中

  • 效果如下:

    Navigation
    Navigation

好了,接下来就是来操作了

  1. 我们先双击打开 MainPage.xaml ,然后在这个页面里面新建一个 TextBlock 用于让我们了解我们在哪个页面,代码如下:

    <TextBlock Text="This is page 1" Foreground="Blue" FontSize="30"/>
    

    其中属性根据自己喜好设定,我们只是为了便于区分是哪个页面。

  2. 然后我们再新建一个 Button ,代码如下:

    <Button Content="Click to navigate to page 2" FontSize="30"/>
    

    这时候我们只是建立了一个 Button ,但是我们想要的效果是,按下这个 Button 后软件处理相应的逻辑,这里也就是导航。那这时候,我们需要建立一个事件,在 Button 内添加一个 Click 的事件,截图如下:

 上面截图所示,这时候 vs 提示我么新建一个 Event Handler,因为我们之前没有定义,所以这时候,直接按回车,vs 会自动帮我们生成。代码如下:

 ``` xaml
 <Button Content="Click to navigate to page 2" FontSize="30" Click="Button_Click"/>
 ```

 按完回车后,vs 自动帮我们在对应的 `.xaml.cs` 文件中建立了一个点击事件。比如这时候就在 `MainPage.xaml.cs` 中建立了一个空的事件,如下面截图中红方框内所示就是新建的空事件:

 ![][img3]

 

 **解释:**这个所谓的空事件,你暂时简单了解为,一旦我点按了相应的按钮,那么软件就会执行这个事件里面的代码。
  1. 接下来,我们在 MainPage.xamlMainPage.xaml.cs 两个文件中的设置暂告一个段落。我们现在需要新建一个页面。

    • 先右击你想新建文件的目录(如果想在根目录新建,那就右击项目名字那一栏),如下图所示,点击 Add -> New Item 或者直接 Control + Shift + A

 * 然后跳出对话框后,如下图所示,选择 `Blank Page` ,下面名字根据自己喜好,这里为了方便,命名为 Page2,然后点 `Add` 

   ![][img5]

   

 * 新建完成后,我们双击打开 `Page2.xaml` ,进行编辑
  1. 在新的页面中也建立一个 TextBlock 去区分页面,和一个 Button ,因为我们还要从 Page2 返回到 MainPage 呢!最终代码如下:

    • XAML:

      <StackPanel>
         <TextBlock Text="This is Page 2" Foreground="Brown" FontSize="30"/>
         <Button Content="Click to navi to page 1" FontSize="30" Click="Button_Click"/>
      </StackPanel>
      
    • Csharp:

      private void Button_Click(object sender, RoutedEventArgs e)
      {
      
      }
      
  2. 然后我们要处理导航了!我们先回到 MainPage.xaml.cs 中,在刚刚新建的空事件中写入下面这行代码:

    this.Frame.Navigate(typeof(Page2));
    

    完整代码如下:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
         this.Frame.Navigate(typeof(Page2));
    }
    

    解释:这行代码就表示将当前页面导航到 Page2,typeof 后面括号里面就填你要导航到的页面的名字。

  3. 同样,我们在 Page2.xaml.cs 文件中,在刚刚新建的空事件中写入下面代码:

    this.Frame.Navigate(typeof(MainPage));
    

    这就意味着,导航到 MainPage。

  4. 最后!编译!你就得到了我们想要的结果啦!

如何实现页面内局部导航

  • 什么是页面内局部导航?

    比如我想让 MainPage 左半部分放一些控件,而右半部分在按下某个按钮后,导航到 Page2。这个就是局部导航了,局部导航的应用也非常广泛,比如出了名的汉堡导航,汉堡按钮那一侧是不会变的,而主页面区域进行导航。

  • 效果如下图:

接下来我们就来操作

  • 首先我们现在 MainPage 中建立两列,将我们的控件放在第一列,完整代码如下:

    <Grid>
       <Grid.ColumnDefinitions>
           <ColumnDefinition Width="*"/>
           <ColumnDefinition Width="*"/>
       </Grid.ColumnDefinitions>
    
       <StackPanel>
           <TextBlock Text="This is page 1" Foreground="Blue" FontSize="30"/>
           <Button Content="Click to navigate to page 2" FontSize="30" Click="Button_Click"/>
       </StackPanel>
    </Grid>
    
  • 然后我们建了一个新的东西,叫做 Frame ,并把它放在第二列,具体代码如下:

    <Frame Name="myFrame" Grid.Column="1">
                
    </Frame>
    

    解释:记得给它起一个名字,因为这样我们才可以在后面的 c# 文件中使用这个控件,更多关于 Name 这个属性和在 c# 文件中调用 xaml 中控件的知识,将在后面讲。

  • 然后我们打开 MainPage.xaml.cs 这个文件,找到按钮点击事件的代码,并将之前的那一行全局导航的代码改为以下代码:

    myFrame.Navigate(typeof(Page2));
    

    解释:其中 myFrame 就是我们之前在 XAML 中给 Frame 这个控件的名字,剩下的和之前的代码其实都一样。而全局导航的时候,为什么我们写的是 this.Frame.Navigate 的?因为每个页面本身外面就包了一个用于导航的 Frame ,而有一定编程基础的朋友应该知道 this 的涵义,如果你不知道,那你就粗略的理解为 this.Frame 就指代了页面本身外面包裹的 Frame ,类同于 myFrame

  • 最后,我们编译!!!当然就是你想要的效果!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,975评论 3 119
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,381评论 0 17
  • 在潍坊十中里,坐落着一个不大不小的花园,它是我们的乐园。在美丽的早春,他的是学校最美丽的季节,是整个校园...
    杨梦佳阅读 402评论 2 2
  • 偶然看了电影《哪一天我们会飞》,觉得很好,强烈推荐给了同事,同事看完之后跟我说:“Y ,这电影我看了觉得感觉一...
    Annhly阅读 190评论 0 0
  • 小编在HTML的开发中遇到了一个这样的需求问题,即需要先用jQuery增加一段含Swiper的代码,然后再通过其他...
    神SKY阅读 2,938评论 0 2