Notes项目是Xamarin.Forms跨平台便签应用,整体解决方案包含4个项目:
- Notes:.NET Standard库项目,存放全部共享代码与共享UI界面。
- Notes.Android:Android平台专属代码,Android应用入口。
- Notes.iOS:iOS平台专属代码,iOS应用入口。
- Notes.UWP:通用Windows平台专属代码,UWP应用入口。
Visual Studio中Notes(.NET Standard)项目内容: 项目依赖节点包含NuGet和SDK:
- NuGet:Xamarin.Forms、sqlite-net-pcl包。
- SDK:NETStandard.Library元包,包含一整套.NET Standard相关NuGet包。
项目文件清单:
Data\NoteDatabase.cs:数据库操作类,实现数据表创建、查询、新增、修改、删除。Models\Note.cs:便签实体模型类,保存单条便签的数据。App.xaml:App类XAML标记,定义应用级资源字典(颜色、样式、尺寸)。App.xaml.cs:App后台代码,创建首页、管理应用生命周期事件。AssemblyInfo.cs:程序集级别项目属性配置。NotesPage.xaml:便签列表页XAML,定义程序启动首页UI。NotesPage.xaml.cs:列表页后台代码,处理页面交互业务逻辑。NoteEntryPage.xaml:便签编辑页XAML,用于输入、修改便签的UI。NoteEntryPage.xaml.cs:编辑页后台代码,处理保存、删除交互逻辑。
体系结构和应用程序基础知识
Xamarin.Forms应用采用跨平台架构,共享代码放在.NET Standard库,各个平台项目引用这份共享代码。

Xamarin.Forms应用有唯一App类,负责设置应用首页:
using Xamarin.Forms;
namespace Notes
{
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new NavigationPage(new NotesPage());
}
...
}
}
Code language: PHP (php)
代码将MainPage设置为NavigationPage实例,内部承载NotesPage。
AssemblyInfo.cs配置XAML编译特性:
using Xamarin.Forms.Xaml;Code language: CSS (css)
布局
NoteEntryPage使用StackLayout实现页面布局,垂直排列控件。
响应用户交互
XAML定义UI控件,控件触发事件,在后台代码隐藏文件处理。 示例:保存按钮点击事件
async void OnSaveButtonClicked(object sender, EventArgs e)
{
var note = (Note)BindingContext;
note.Date = DateTime.UtcNow;
await App.Database.SaveNoteAsync(note);
await Navigation.PopAsync();
}
Code language: JavaScript (javascript)
列表
ListView用于展示集合数据,每一条数据显示在单元格内。
<ListView x:Name="listView"
Margin="{StaticResource PageMargin}"
ItemSelected="OnListViewItemSelected">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Text}"
Detail="{Binding Date}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Code language: HTML, XML (xml)
ListView.ItemTemplate定义每行单元格布局,使用数据绑定展示便签信息。 在后台代码通过ItemsSource绑定数据源:
protected override async void OnAppearing()
{
base.OnAppearing();
listView.ItemsSource = await App.Database.GetNotesAsync();
}
Code language: JavaScript (javascript)
页面显示时,从数据库读取所有便签,加载到ListView。
导航
Xamarin.Forms支持分层导航,依靠NavigationPage维护页面堆栈(后进先出LIFO)。
PushAsync:将新页面压入导航堆栈,跳转到新页面。PopAsync:弹出当前页面,返回上一页。
NavigationPage自带导航栏,包含页面标题和平台返回按钮。 放入堆栈的第一个页面称为根页面。
public App ()
{
...
MainPage = new NavigationPage (new NotesPage ());
}
Code language: PHP (php)
ContentPage自带Navigation属性,只有在使用NavigationPage时才能调用导航方法。
跳转到编辑页:
await Navigation.PushAsync(new NoteEntryPage());
Code language: JavaScript (javascript)
返回上一页:
await Navigation.PopAsync();
Code language: JavaScript (javascript)
数据绑定
数据绑定建立UI(目标对象)和业务数据(源对象)之间的连接,自动同步数据。
- 源对象:提供数据
- 目标对象:展示数据

绑定两个步骤:
- 设置目标对象
BindingContext为数据源对象 - 在XAML中使用
{Binding}建立属性绑定
async void OnNoteAddedClicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new NoteEntryPage
{
BindingContext = new Note()
});
}
async void OnListViewItemSelected(object sender, SelectedItemChangedEventArgs e)
{
if (e.SelectedItem != null)
{
await Navigation.PushAsync(new NoteEntryPage
{
BindingContext = e.SelectedItem as Note
});
}
}
Code language: JavaScript (javascript)
BindingContext具有继承特性:页面设置BindingContext后,页面内所有子控件自动继承该上下文,不需要逐个设置。
Editor绑定Note模型Text属性(双向绑定):
<Editor Placeholder="Enter your note"
Text="{Binding Text}"
... />
Code language: HTML, XML (xml)
修改Editor文本会自动同步到Note对象;修改Note.Text,UI也会自动更新。
样式
Style统一定义控件外观,包含多个Setter,Setter指定属性名与对应值。 隐式样式示例:
<ContentPage xmlns="[http://xamarin.com/schemas/2014/forms](http://xamarin.com/schemas/2014/forms)"
xmlns:x="[http://schemas.microsoft.com/winfx/2009/xaml](http://schemas.microsoft.com/winfx/2009/xaml)"
x:Class="Notes.NoteEntryPage"
Title="Note Entry">
<ContentPage.Resources>
<!-- Implicit styles -->
<Style TargetType="{x:Type Editor}">
<Setter Property="BackgroundColor"
Value="{StaticResource AppBackgroundColor}" />
</Style>
...
</ContentPage.Resources>
...
</ContentPage>
Code language: HTML, XML (xml)