便签项目介绍

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(目标对象)和业务数据(源对象)之间的连接,自动同步数据。

  • 源对象:提供数据
  • 目标对象:展示数据

绑定两个步骤:

  1. 设置目标对象BindingContext为数据源对象
  2. 在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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注