适用于初学者的 .NET MAUI | Microsoft Learn
记录微软Learn中用到的代码。文章比较粗糙,大部分是项目代码粘贴。想详细学习的可到上面的链接学习,代码可以从这里复制后直接运行。
练习中一共有两个页面:
1、MainPage.xaml 用于添加列表中的内容。主要功能有向列表中添加一项;左滑删除该项;点击该选项进入详情页面。
2、DetailPage.xaml 显示详细信息,实际上显示的很少。返回主界面。
用到的MVVM包有:
1、CommunityToolkit.Mvvm
接下来是MainPage.xaml代码:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="MauiAppDemo1.MainPage"xmlns:viewmode="clr-namespace:MauiAppDemo1.ViewModel"x:DataType="viewmode:MainViewModel"><Grid RowDefinitions="100,Auto,*"ColumnDefinitions=".75*,.25*"Padding="10"RowSpacing="10"ColumnSpacing="10"><Image Grid.ColumnSpan="2"Source="dotnet_bot.png"Background="white"/><Entry Placeholder="Enter task"Text="{Binding Text}"Grid.Row="1"/><Button Text="Add"Command="{Binding AddCommand}"Grid.Row="1"Grid.Column="1"/><CollectionView Grid.Row="2" Grid.ColumnSpan="2"ItemsSource="{Binding Items}"SelectionMode="None"><!--<CollectionView.ItemsSource><x:Array Type="{x:Type x:String}"><x:String>Apples</x:String><x:String>Bananas</x:String><x:String>Oranges</x:String></x:Array></CollectionView.ItemsSource>--><CollectionView.ItemTemplate><DataTemplate x:DataType="{x:Type x:String}"><SwipeView><SwipeView.RightItems><SwipeItems> <SwipeItem Text="Delete"BackgroundColor="Red"Command="{Binding Source={RelativeSource AncestorType={x:Type viewmode:MainViewModel}},Path=DeleteCommand}"CommandParameter="{Binding .}"/></SwipeItems></SwipeView.RightItems><Grid Padding="0,5"><Frame><Frame.GestureRecognizers><TapGestureRecognizer Command="{Binding Source={RelativeSource AncestorType={x:Type viewmode:MainViewModel}},Path=TapCommand}"CommandParameter="{Binding .}"/></Frame.GestureRecognizers><Label Text="{Binding .}"FontSize="24"/></Frame></Grid></SwipeView></DataTemplate></CollectionView.ItemTemplate></CollectionView></Grid></ContentPage>
using MauiAppDemo1.ViewModel;namespace MauiAppDemo1;public partial class MainPage : ContentPage
{int count = 0;public MainPage(MainViewModel vm){InitializeComponent();BindingContext = vm;}}
using MauiAppDemo1.ViewModel;namespace MauiAppDemo1;public static class MauiProgram
{public static MauiApp CreateMauiApp(){var builder = MauiApp.CreateBuilder();builder.UseMauiApp<App>().ConfigureFonts(fonts =>{fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");});builder.Services.AddSingleton<MainPage>();builder.Services.AddSingleton<MainViewModel>();builder.Services.AddTransient<DetailPage>();builder.Services.AddSingleton<DetailViewModel>(); return builder.Build();}
}
namespace MauiAppDemo1;public partial class AppShell : Shell
{public AppShell(){InitializeComponent();Routing.RegisterRoute(nameof(DetailPage),typeof(DetailPage));}
}
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace MauiAppDemo1.ViewModel
{/// <summary>/// CommunityToolkit.Mvvm/// </summary>public partial class MainViewModel : ObservableObject{public MainViewModel(){items = new ObservableCollection<string>();}[ObservableProperty]ObservableCollection<string> items;[ObservableProperty]string text;[RelayCommand]void Add(){if (string.IsNullOrWhiteSpace(Text)) return;items.Add(Text);Text = string.Empty;}[RelayCommand]void Delete(string s){if (items.Contains(s)){items.Remove(s);}}[RelayCommand] async Task Tap(string s){await Shell.Current.GoToAsync($"{nameof(DetailPage)}?Text={s}");}}/// <summary>/// 基本写法/// </summary>//public class MainViewModel : INotifyPropertyChanged//{// string text;// public string Text// {// get => text;// set// {// text=value;// OnPropertyChanged(nameof(Text));// }// }// public event PropertyChangedEventHandler PropertyChanged;// void OnPropertyChanged(string name)=>PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));//}
}
DetailPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="MauiAppDemo1.DetailPage"xmlns:viewmodel="clr-namespace:MauiAppDemo1.ViewModel"x:DataType="viewmodel:DetailViewModel"Title="DetailPage"><VerticalStackLayout Padding="20"><Label Text="{Binding Text}"FontSize="25"VerticalOptions="Center" HorizontalOptions="Center" /><Button Text="Go Back"Command="{Binding GoBackCommand}"/></VerticalStackLayout>
</ContentPage>
using MauiAppDemo1.ViewModel;namespace MauiAppDemo1;public partial class DetailPage : ContentPage
{public DetailPage(DetailViewModel vm){InitializeComponent();BindingContext = vm;}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;namespace MauiAppDemo1.ViewModel
{[QueryProperty("Text","Text")]public partial class DetailViewModel:ObservableObject{[ObservableProperty]string text;[RelayCommand]async Task GoBack(){await Shell.Current.GoToAsync("..");}}
}