Xamarin.Forms Shell 应用程序深入解析

Viewed 0

在 Xamarin.Forms 快速入门中,我们生成了 Notes 应用程序。本文将对已生成的内容进行回顾,深入探讨 Xamarin.Forms Shell 应用程序的工作原理和基础知识。

Visual Studio 简介

Visual Studio 将代码组织为解决方案和项目。解决方案是可以容纳一个或多个项目的容器,项目可以是应用程序、支持库或测试应用程序等。Notes 应用程序包含一个内附三个项目的解决方案:Notes 项目是一个 .NET Standard 库项目,包含所有共享代码和共享 UI;Notes.Android 项目包含 Android 特定代码,是 Android 应用程序的入口点;Notes.iOS 项目包含 iOS 特定代码,是 iOS 应用程序的入口点。

Xamarin.Forms 应用程序的剖析

Notes .NET Standard 库项目具有包含 NuGet 和 SDK 节点的依赖项节点。NuGet 节点包括已添加的 Xamarin.Forms、Xamarin.Essentials、Newtonsoft.Json 和 sqlite-net-pcl NuGet 包;SDK 节点则引用 NETStandard.Library 元包,该元包定义了一整套 .NET Standard NuGet 包。

项目还包括多个关键文件:Data\\NoteDatabase.cs 类包含用于创建数据库、读写和删除数据的代码;Models\\Note.cs 类定义了一个 Note 模型,用于存储每个便笺的数据;多个 XAML 文件如 Views\\AboutPage.xamlViews\\NotesPage.xamlViews\\NoteEntryPage.xaml 分别定义页面的 UI,对应的代码隐藏文件包含用户交互时的业务逻辑;App.xamlApp.xaml.cs 负责应用程序资源和生命周期事件;AppShell.xamlAppShell.xaml.cs 定义应用程序的视觉层次结构和路由;AssemblyInfo.cs 文件包含程序集级别的应用程序属性。

Visual Studio for Mac 简介

Visual Studio for Mac 同样遵循将代码组织为解决方案和项目的做法。Notes 应用程序的解决方案也包含三个项目:Notes .NET Standard 库项目、Notes.Droid 项目(Android 入口点)和 Notes.iOS 项目(iOS 入口点),结构与 Visual Studio 类似。

体系结构和应用程序基础知识

Xamarin.Forms 应用程序采用传统跨平台构建方式,共享代码通常位于 .NET Standard 库中,平台特定应用程序使用此共享代码。Notes 应用程序的体系结构体现了这种关系。Xamarin.Forms 应用程序有一个名为 App 的类,负责实例化每个平台上的应用程序。在 App 类中,MainPage 属性被设置为 AppShell 对象,该对象定义应用程序的视觉层次结构,Shell 负责生成用户界面。此外,AssemblyInfo.cs 文件中的 XamlCompilation 属性可启用 XAML 编译器,将 XAML 直接编译为中间语言。

在每个平台上启动应用程序

启动应用程序的方式因平台而异。在 iOS 中,Notes.iOS 项目定义了一个继承自 FormsApplicationDelegateAppDelegate 类,其 FinishedLaunching 方法初始化 Xamarin.Forms 框架并加载应用程序。在 Android 中,Notes.Android 项目包括一个继承自 FormsAppCompatActivityMainActivity 类,其 OnCreate 方法同样初始化框架并加载应用程序。

应用程序视觉层次结构

Xamarin.Forms Shell 应用程序的视觉层次结构在 Shell 类的子类中定义。在 Notes 应用程序中,AppShell 类使用 XAML 描述结构,包含一个 TabBar 对象,该对象内有两个 ShellContent 对象,分别对应 Notes 和 About 页面。这些对象不直接表示用户界面,而是组织导航结构,Shell 根据此结构生成导航 UI。

用户界面

Xamarin.Forms 用户界面由页面、视图和布局组成。Notes 应用程序使用 ContentPage 页面、CollectionViewEditorButton 等视图,以及 StackLayoutGrid 布局。StackLayout 用于垂直排列视图,简化跨平台开发,而 Grid 用于水平排列按钮。通过数据绑定和事件处理,用户界面能够响应用户交互。

布局

StackLayout 自动排列视图,不考虑屏幕大小,子元素按添加顺序垂直或水平放置。在 NoteEntryPage 中,StackLayout 包含一个 Editor 和一个 Grid,通过 Margin 属性设置边距。默认方向为垂直,但可通过 Orientation 属性更改为水平。

响应用户交互

XAML 中定义的对象可以触发在代码隐藏中处理的事件。例如,NoteEntryPage 中的保存按钮绑定到 OnSaveButtonClicked 方法,该方法将便笺保存到数据库并导航回上一页。通过 x:Name 属性,代码隐藏可以访问 XAML 中定义的对象。

列表

CollectionView 用于显示便笺列表,默认垂直显示。在 NotesPage 中,CollectionView 通过数据绑定显示数据库中的便笺,每行使用 StackLayout 定义标签显示便笺文本和日期。当选择列表项时,触发 SelectionChanged 事件,执行 OnSelectionChanged 方法处理导航。

导航

Shell 应用程序中通过 URI 执行导航。导航 URI 可以包含路由、页面和查询参数。首先,需要在 Shell 路由系统中注册不在视觉层次结构中的页面,如 NoteEntryPage 通过 Routing.RegisterRoute 注册。导航通过 GoToAsync 方法执行,可以传递查询参数。例如,从 NotesPage 导航到 NoteEntryPage 时,传递便笺的 ID 作为查询参数。目标页面使用 QueryPropertyAttribute 接收数据。向后导航通过传递 ".." 参数实现。

数据绑定

数据绑定连接源对象和目标对象,简化数据同步。在 Notes 应用程序中,NoteEntryPageEditor 绑定到 Note 对象的 Text 属性。通过设置页面的 BindingContextNote 实例,所有子元素都可以绑定到该对象的属性。绑定在 XAML 中使用 Binding 标记扩展建立,支持双向更新,确保 UI 和数据源的一致性。

样式

样式将属性值分组,应用于多个视觉对象元素,减少重复标记。样式可以在应用程序、页面或视图级别定义。在 NoteEntryPage 中,定义了一个隐式样式应用于所有 Editor 实例,设置其背景颜色。样式必须指定 TargetType,并通过 Setter 对象定义属性和值。

测试和部署

测试和部署是应用程序开发的关键环节。使用模拟器进行初步测试,但应尽早在实际设备上测试以确保兼容性。调试工具如断点和日志输出有助于诊断问题。对于 iOS 和 Android 设备,需要进行相应的预配和设置。

后续步骤

建议进一步学习 Xamarin.Forms Shell、控件引用、数据绑定、导航、样式、数据模板、效果、自定义呈现器以及通过 DependencyService 访问本机功能。这些主题将帮助深入掌握 Xamarin.Forms 开发。

0 Answers