博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第二十四章:页面导航(六)
阅读量:6329 次
发布时间:2019-06-22

本文共 3063 字,大约阅读时间需要 10 分钟。

制作导航菜单

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

其他17个是相似的。 有些页面在代码隐藏文件中有一些代码,但大多数只是调用InitializeComponent。

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

每个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
(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的值。

__

现在,当您在SliderPage上操作Slider,然后返回到home并再次导航到SliderPage时,Slider将是相同的,因为它是相同的页面实例。

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

转载地址:http://hjboa.baihongyu.com/

你可能感兴趣的文章
tar 命令的详解
查看>>
Cisco路由器安全配置
查看>>
第十次作业
查看>>
spring事务管理(一)
查看>>
给定一个字符串s,返回去掉子串"mi"后的字符串。
查看>>
Nginx 外的另一选择,轻量级开源 Web 服务器 Tengine 发布新版本
查看>>
Wrod中超链接的一些技巧
查看>>
我的友情链接
查看>>
IP_VFR-4-FRAG_TABLE_OVERFLOW【cisco设备报错】碎片***
查看>>
Codeforces Round #256 (Div. 2) D. Multiplication Table 【二分】
查看>>
ARM汇编指令格式
查看>>
HDU-2044-一只小蜜蜂
查看>>
HDU-1394-Minimum Inversion Number
查看>>
jsonView谷歌插件
查看>>
df -h 卡住
查看>>
K-means算法(理论+opencv实现)
查看>>
第七天1
查看>>
[转] createObjectURL方法 实现本地图片预览
查看>>
Jquery中的Jquery.extend, Jquery.fn.extend,Jquery.prototype
查看>>
JavaScript—DOM编程核心.
查看>>