制作导航菜单
如果您的应用程序包含各种不同但在架构上相同的页面,所有这些页面都可以从主页导航,那么您可能有兴趣构建有时称为导航菜单的页面。 这是一个菜单,其中每个条目都是特定的页面类型。
ViewGalleryType程序旨在演示Xamarin.Forms中的所有View类。 它包含一个主页和一个页面,用于Xamarin.Forms中的每个可实例化类,它们来自View而不是Layout,但Map和OpenGLView除外。 这是18个类和18个ContentPage衍生产品,加上主页。 (项目名称上的类型后缀的原因很快就会显现出来。)
这18个页面类都存储在Portable Class Library中名为ViewPages的文件夹中。 这是一个例子:SliderPage.xaml。 它只是一个标签绑定到Value属性的Slider:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="ViewGalleryType.SliderPage"Title="Slider"><StackLayout Padding="10, 0"><Slider x:Name="slider"VerticalOptions="CenterAndExpand" /><Label Text="{Binding Source={x:Reference slider},Path=Value,StringFormat='The Slider value is {0}'}"VerticalOptions="CenterAndExpand"HorizontalAlignment="Center" /></StackLayout>
</ContentPage> 

其他17个是相似的。 有些页面在代码隐藏文件中有一些代码,但大多数只是调用InitializeComponent。
此外,ViewGalleryType项目有一个名为Images的文件夹,其中包含18个位图,每个View衍生的名称都延伸到几乎填满位图的表面。 这些位图由Windows Presentation Foundation程序生成,并在项目中标记为EmbeddedResource。 该项目还包含第13章“嵌入式资源”一节中描述的ImageResourceExtension类,以引用XAML文件中的位图。
主页名为ViewGalleryTypePage。 它在表的六个不同部分组装了18个ImageCell元素:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:local="clr-namespace:ViewGalleryType;assembly=ViewGalleryType"x:Class="ViewGalleryType.ViewGalleryTypePage"Title="View Gallery"><TableView Intent="Menu"><TableRoot><TableSection Title="Presentation Views"><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.Label.png}"Text="Display text"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:LabelPage}" /><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.Image.png}"Text="Display a bitmap"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:ImagePage}" /><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.BoxView.png}"Text="Display a block"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:BoxViewPage}" /><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.WebView.png}"Text="Display a web site"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:WebViewPage}" /></TableSection><TableSection Title="Command Views"><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.Button.png}"Text="Initiate a command"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:ButtonPage}" /><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.SearchBar.png}"Text="Initiate a text search"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:SearchBarPage}" /></TableSection><TableSection Title="Data-Type Views"><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.Slider.png}"Text="Range of doubles"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:SliderPage}" /><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.Stepper.png}"Text="Discrete doubles"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:StepperPage}" /><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.Switch.png}"Text="Select true or false"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:SwitchPage}" /><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.DatePicker.png}"Text="Select a date"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:DatePickerPage}" /><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.TimePicker.png}"Text="Select a time"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:TimePickerPage}" /></TableSection><TableSection Title="Text-Editing Views"><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.Entry.png}"Text="Edit a single line"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:EntryPage}" /><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.Editor.png}"Text="Edit a paragraph"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:EditorPage}" /></TableSection><TableSection Title="Activity Indicator Views"><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.ActivityIndicator.png}"Text="Show activity"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:ActivityIndicatorPage}" /><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.ProgressBar.png}"Text="Show progress"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:ProgressBarPage}" /></TableSection><TableSection Title="Collection Views"><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.Picker.png}"Text="Pick item from list"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:PickerPage}" /><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.ListView.png}"Text="Show a collection"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:ListViewPage}" /><ImageCell ImageSource="{local:ImageResource ViewGalleryType.Images.TableView.png}"Text="Show form or menu"Command="{Binding NavigateCommand}"CommandParameter="{x:Type local:TableViewPage}" /></TableSection></TableRoot></TableView>
</ContentPage>

每个ImageCell都引用一个指示视图名称的位图和一个简要描述视图的Text属性。 ImageCell的Command属性绑定到ICommand对象
在代码隐藏文件中实现,CommandParameter是一个引用其中一个页面类的x:Type标记扩展。 您可能还记得,x:Type标记扩展是C#typeof运算符的XAML等效项,并且每个CommandParameter都是Type类型。
以下是三个平台上主页的外观:
2019_04_18_213330
代码隐藏文件定义每个ImageCell在绑定中引用的NavigateCommand属性。 Execute方法实现为lambda函数:它将Type参数(从XAML文件中的CommandParameter设置)传递给Activator.CreateInstance以实例化页面,然后导航到该页面:

public partial class ViewGalleryTypePage : ContentPage
{public ViewGalleryTypePage(){InitializeComponent();NavigateCommand = new Command<Type>(async (Type pageType) =>{Page page = (Page)Activator.CreateInstance(pageType);await Navigation.PushAsync(page);});BindingContext = this;}public ICommand NavigateCommand { private set; get; }
}

构造函数通过将其BindingContext属性设置为自身来结束,因此XAML文件中的每个ImageCell都可以通过简单的Binding引用NavigateCommand属性。
点击Slider条目(例如)导航到SliderPage:
2019_04_18_213559
返回主页需要使用iOS和Android屏幕上的导航栏或Android和Windows 10 Mobile屏幕上的后退按钮。
每次导航到该页面时都会创建每个页面的新实例,因此SliderPage的这些不同实例当然不会保留您之前设置的Slider的值。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:local="clr-namespace:ViewGalleryInst;assembly=ViewGalleryInst"x:Class="ViewGalleryInst.ViewGalleryInstPage"Title="View Gallery"><TableView Intent="Menu"><TableRoot><TableSection Title="Presentation Views"><ImageCell ImageSource="{local:ImageResource ViewGalleryInst.Images.Label.png}"Text="Display text"Command="{Binding NavigateCommand}"><ImageCell.CommandParameter><local:LabelPage /></ImageCell.CommandParameter></ImageCell>__<ImageCell ImageSource="{local:ImageResource ViewGalleryInst.Images.TableView.png}"Text="Show form or menu"Command="{Binding NavigateCommand}"><ImageCell.CommandParameter><local:TableViewPage /></ImageCell.CommandParameter></ImageCell></TableSection></TableRoot></TableView>
</ContentPage>

现在,当您在SliderPage上操作Slider,然后返回到home并再次导航到SliderPage时,Slider将是相同的,因为它是相同的页面实例。
请记住,使用此配置,程序启动时总共会实例化19个页面类,这意味着将解析19个XAML文件,这可能会影响启动性能,并占用大量内存。
此外,在此运行时解析期间找到的XAML文件中的任何错误也将在程序启动时显现。 可能很难准确发现哪个XAML文件存在问题! 在构建一次性实例化多个页面类的程序时,您需要以增量方式添加新类,以确保在继续之前一切正常。
更好的是,完全避免这种技术。 根据需要实例化每个页面,并使用ViewModel保留与页面关联的数据。

第二十四章:页面导航(六) 1相关推荐

  1. 鸟哥的Linux私房菜(基础篇)- 第二十四章、 X Window 配置介绍

    第二十四章. X Window 配置介绍 最近升级日期:2009/08/07 在 Linux 上头的图形介面我们称之为 X Window System,简称为 X 或 X11 罗!为何称之为系统呢?这 ...

  2. 微信小程序(第二十四章)- 数据交互前置

    微信小程序(第二十四章)- 数据交互前置 讲解微信小程序前置的原因 参考文档 理解微信小程序 小程序简介 作用 提问 针对提问--uni-app介绍 小程序和普通网页开发的区别 小程序代码构成 文件个 ...

  3. 第二十四章、 X Window 配置介绍

    好文章 第二十四章. X Window 配置介绍 http://vbird.dic.ksu.edu.tw/linux_basic/0590xwindow.php 最近升级日期:2009/08/07 在 ...

  4. JavaScript高级程序设计第四版学习--第二十四章

    title: JavaScript高级程序设计第四版学习–第二十四章 date: 2021-5-31 10:46:01 author: Xilong88 tags: JavaScript 本章内容: ...

  5. 第二十四章 并发编程

    第二十四章 并发编程 爱丽丝:"但是我不想进入疯狂的人群中" 猫咪:"oh,你无能为力,我们都疯了,我疯了,你也疯了" 爱丽丝:"你怎么知道我疯了&q ...

  6. 【正点原子FPGA连载】第二十四章HDMI彩条显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  7. ​第二十四章:皮衣大卖

    第二十四章:皮衣大卖 店铺掌柜说:"准备原材料?我这边都有原材料啊!还准备什么?" "不不不,这原材料必须本人亲自去准备."李丽质说道. "为何?&q ...

  8. 第二十四章 异常和错误处理 1异常

    // 第二十四章 异常和错误处理 //1异常 /*#include <iostream> using namespace std; class wrong{}; void error() ...

  9. 第二十四章 SQL函数 CEILING

    文章目录 第二十四章 SQL函数 CEILING 大纲 参数 描述 示例 第二十四章 SQL函数 CEILING 数值函数,返回大于或等于给定数值表达式的最小整数. 大纲 CEILING(numeri ...

  10. 第二十四章 Caché 变量大全 $ZA 变量

    文章目录 第二十四章 Caché 变量大全 $ZA 变量 大纲 描述 注意 `$ZA`,带终端I / O 带磁带I / O的$ZA 第二十四章 Caché 变量大全 $ZA 变量 包含当前设备上最后一 ...

最新文章

  1. SAP ABAP实用技巧介绍系列之已知某个signature查找定义的方法
  2. 每次新建Android项目都报样式找不到的错误?
  3. string 转比较运算符_运算符
  4. poj 3485 区间选点
  5. Python常用小技巧(二)——打开图片
  6. android 两个imageview重叠,android-在现有ListVIew中添加更多项目时,ImageView重叠
  7. 简明 MongoDB 入门教程 1
  8. Android 安全 (一)
  9. pks服务器清除归档文件路径,HoneywellPKS系统维护手册.doc
  10. 学会写出"图形界面+数据库"的程序要多长时间?
  11. C语言钩子函数获取键盘事件,(C#)透过键盘钩子获取ScanCode/VkCode
  12. uniapp开发微信公众号(支付宝支付)
  13. 服务器加什么网站才打开快,如何优化让网站打开速度更快些呢?
  14. 瑞科生物通过聆讯:9个月亏损超5亿 君联与红杉是股东
  15. 华为鸿蒙推送机型,华为鸿蒙系统开始推送,这15款机型可率先升级,有你的吗?...
  16. 小程序文档整理之 -- API(媒体)
  17. 到底有几个鸿蒙OS? 谈谈我眼里的鸿蒙操作系统
  18. 一年多前的Linux笔记,仅以此文纪念当时的年少无知
  19. Android应用如何隐藏APP桌面图标
  20. 《英雄联盟》首部成人动画全球爆火,尺度有点大啊!

热门文章

  1. 关于php反射机制的一些理解
  2. java调用其他程序吗_java本地方法如何调用其他程序函数,方法详解
  3. 二叉搜索树的删除_LeetCode109.有序链表转换二叉搜索树
  4. 鱼骨图分析法实际案例_8D根本原因分析——5WHY与鱼骨图培训课件(PPT64完整详细)...
  5. 九宫格 java_java输出九宫格的程序问题
  6. php pg connect 扩展,php安装gnupg扩展
  7. trackbar控件显示刻度值_安卓自定义电平流图形控件
  8. 数字图像处理与python实现 pdf_python数字图像处理的学习路线?
  9. python求平均工资_python如何求列表平均值?
  10. jmeter简单使用