乘风破浪,遇见最美Windows 11之现代Windows桌面应用开发 - 使用Visual Studio 2022 v17.3浅尝跨平台UI框架.NET MAUI

什么是.NET MAUI

https://dotnet.microsoft.com/zh-cn/apps/maui

image

.NET Multi-platform App UI (.NET MAUI)是一个框架,用于在单个代码库中使用C#和XAML构建新式、多平台、本机编译的iOS、Android、macOS和Windows应用。

image

.NET MAUI使用最新的新式技术在Android、iOS、macOS和Windows上构建本机应用,将它们抽象为基于.NET 6构建的通用框架。

默认情况下,本机应用的外观与它们所属的操作系统类似,并且布局自动完全适应每个设备,无需额外代码。

平台API可直接从C#获得,以从单个跨平台API访问60多个平台功能,包括访问隔离存储、传感器、地理位置、相机等内容,但不会受到任何影响。

历史

  • 在2020年5月, 微软宣布了MAUI跨平台框架, MAUI是Xamarin.Forms演变而来, 这也就意味着, 如果你原来具备Xamarin.Forms开发经验, 你可以流畅的过渡到MAUI开发当中
  • 原本于2021年底发布的MAUI正式版被推迟到了2022年5月底发布。现在, 你目前可以通过安装VS2022 预览版进行安装MAUI开发选项。 此版本中, 将不会存在Xamarin.Forms项目模板。

特性

  • 单个代码库支持多个平台
  • 完整的热重载功能 (.NET/XAML)
  • 原生平台UI
  • 支持完整的自绘
  • 多窗口模式
  • 集成跨平台本机API
  • 支持.NET6/C#10新特性

对比Xamarin.Forms

平台架构

.NET MAUI与.NET 6.0集成。

Xamarin.Forms MAUI
image image

项目结构

使用Xamarin.Forms,开发人员可能会在处理针对多个平台的多个项目时感到繁琐。图像,字体和平台相关代码的维护; 添加不同的依赖项,并在它们被引用为NuGet包时解析它们。遇到这些问题后,开发人员现在可以在.NET MAUI中通过单个项目得到解决

由于.NET MAUI是一个简单的项目应用,因此它可以在基于多目标的结构上运行。.NET MAUI应用包含一个"Platforms"文件夹,其子文件夹表示Android、iOS Maccatalyst和Windows等平台,以定位在平台上启动应用的特定于平台的代码。它也可以根据您自己的文件名进行多目标。

Xamarin.Forms MAUI
每个平台维护一个单独的项目 一个项目支持多个平台
平台相关的代码在不同项目中单独维护 在Platforms文件夹中维护

受支持的平台

Xamarin和.NET MAUI之间平台支持的主要区别在于它们对Windows的支持。Xamarin支持UWP,而.NET MAUI支持WinUI

Xamarin.Forms MAUI
Android 4.4(API19)或更高版本 Android 5.0(API 21)或更高版本
iOS 9或更高版本 iOS 10或更高版本
UWP:Windows 10,内部版本10.0.16299.0或更高版本,用于.NET Standard 2.0支持 使用WindowsUI库(WinUI)3 Windows 11和Windows 10版本1809或更高版本
使用Mac Catalyst macOS 10.13或更高版本
其他平台支持:Tizen、macOS 10.13或更高版本、GTK#、WPF 其他平台支持:Tizen由三星支持;Linux由社区支持。

.NET CLI

.NET命令行界面(CLI)是一个跨平台工具链,用于开发、构建、运行和发布.NET应用程序。此.NET CLI为.NET MAUI应用程序提供了无缝的构建和运行体验。

Xamarin.Forms MAUI
Xamarin支持.NET Framework来构建和运行应用 .NET MAUI支持.NET CLI工具链来构建、运行和发布.NET应用程序。

渲染器和处理程序架构

在Xamarin中,控件是使用呈现器创建的。当开发人员想要自定义本机控件的UI时,他们必须使用自定义呈现器来执行此操作。这些渲染器在性能和应用大小方面花费了大量用户。

但是.NET MAUI使用的处理程序体系结构与本机程序集非常松散地耦合。借助本机平台,这会产生具有更好性能的轻量级应用程序。

如果需要,可以在此处使用渲染器。移植时,可以重用Xamarin.Forms自定义呈现器。

Xamarin.Forms MAUI
使用呈现器体系结构 使用处理程序体系结构
与本机控件紧密耦合 与本机控件松散耦合
不能在使用处理程序 如果需要,可以在此处使用渲染器。移植时,可以重用Xamarin.Forms自定义呈现器。
image image

.NET 6和C# 10

.NET MAUI已集成到.NET 6中,而Xamarin.Forms是一个.NET Framework。由于.NET 6集成,您可以在.NET MAUI中使用以下.NET 6和C# 10功能

资源管理

.NET MAUI在资源方面接管了Xamarin,特别是在图像方面。您无需维护一组映像即可满足特定于平台或设备的需求。单个SVG图像足以满足所有平台和设备要求。SVG图像被转换为.png图像,以便在所有平台上工作。

Xamarin.Forms MAUI
资源包括图像和类 资源包括MauiImage和MauiResources等类
需要为特定于平台的设备维护基于分辨率的图像 借助SVG图像,无需维护特定于平台或特定于设备的图像
需要为每个平台单独维护资源文件 资源可以在单个位置进行维护

热重载支持

MAUI支持.NET热重载和XAML热重载。

Xamarin.Forms MAUI
.NET热重载: 不支持NET的编辑和继续功能(但UWP对使用的运行时编辑的支持有限) .NET热重载: 提供完整的.NET热重载支持
XAML热重载: 功能完成:SDK 5.x和Visual Studio 2019版本16.9或更高版本 XAML热重载: 提供完整的支持

图形绘制

在Xamarin中,没有可用于满足任何绘图要求的直接API。您必须使用渲染器在本机端执行此操作。但.NET MAUI现在抽象化了本机绘图,并为您带来了更好的图形API。.NET MAUI中的跨平台图形功能提供了用于绘制和绘制形状的绘图画布。画笔是主要类型。

Xamarin.Forms MAUI
没有可用的图形 图形模式,如绘画,混合可用
无法自定义绘图 支持绘制图形
颜色 画笔

资源和服务

与Xamarin不同,.NET MAUI应用是使用.NET通用主机引导的。因此,如果要初始化任何字体,服务或第三方组件,则可以从单个位置完成

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");
        }
    );
    return builder.Build();
}

可访问性

通常在Xamarin中,我们使用自动化属性和本机API为屏幕阅读器提供对应用中所用控件中文本的适当辅助功能。

但.NET MAUI提供语义属性以在应用中提供辅助功能值(您可以在.NET MAUI中使用自动化属性,但推荐的方法是语义属性)。

Blazor应用程序

在Xamarin中无法开发Blazor混合应用,但你可以生成.NET MAUI Blazor应用

image

跨平台API

Xamarin.Forms MAUI
可以使用Xamarin.Essentials执行设备功能的跨平台API 设备功能的跨平台API也与Microsoft.Maui.Essentials命名空间下的MAUI集成

多窗口

在.NET MAUI中,可以一次在Android,iPad上的iOS,Mac Catalyst和Windows上打开多个窗口。此支持在Xamarin中不可用。

MAUI体系

.NET MAUI的目的是简化多平台应用开发。使用.NET MAUI,您可以使用单个项目创建多平台应用程序,但如有必要,您可以添加特定于平台的源代码和资源。.NET MAUI 的主要目的是使您能够在单个代码库中实现尽可能多的应用程序逻辑和UI布局。

技术堆栈

.NET提供了一系列特定于平台的框架来创建应用:.NET for Android、.NET for iOS(和iPadOS)、.NET for Mac 和WinUI 3(利用Windows App SDK)。这些框架都可以访问相同的.NET 6基类库(BCL)。此库提供用于创建和管理资源的功能,以及用于从代码中抽象出基础设备的详细信息的功能。BCL依赖于.NET运行时来为代码提供执行环境。对于Android,iOS(和iPadOS)和macOS,该环境由Mono实现,Mono是.NET运行时的开源实现。在Windows上,Win32执行相同的角色,只是它针对Windows平台进行了优化。

虽然BCL使在不同类型的设备上运行的应用程序能够共享通用的业务逻辑,但各种平台具有不同的方式来定义应用程序的用户界面。这些平台提供了不同的模型,用于指定用户界面的元素如何通信和相互操作。您可以使用特定于平台的相应框架(Android版.NET、iOS版.NET、Mac版.NET或WinUI 3)为每个平台分别制作UI,但此方法要求您为每个单独的设备系列维护一个代码库。.NET MAUI提供了一个单一框架,用于为移动和桌面应用程序构建UI。使用此框架创建UI(由下图中的箭头1指示),.NET MAUI负责将其转换为相应的平台(箭头 2)。

有时可能需要实现特定于平台的功能。在这些情况下,您可以在特定于平台的框架中调用方法,如下图中的箭头 3突出显示的那样:

image

如何工作

.NET MAUI从UI元素的逻辑描述中抽象出UI元素的实现。可以使用XAML(一种基于XML的平台中立语言)来描述UI。例如,下面的XAML片段显示了按钮控件的说明:

此示例定义按钮的标签(“单击我”),并指定在用户选择按钮时应运行名为“OnCounterClicked”的方法。其他属性可以修改按钮和文本的布局;在此示例中,文本以按钮为中心。语义属性为有视觉障碍的用户提供对辅助功能的支持。

.NET MAUI始终为目标设备生成本机代码,因此您可以获得最佳性能。.NET MAUI使用特定于每个平台和UI元素的“处理程序”来执行操作。例如,如果将应用的iOS作为目标,则.NET MAUI处理程序会将此代码映射到iOS UIButton。如果你在Android上运行,你会得到一个Android AppCompatButton。这些处理程序通过.NET MAUI提供的特定于控件的接口(如按钮的IButton)间接访问。

image

如果你愿意,还可以使用C#代码动态创建UI。此方法使您能够根据环境修改布局。例如,如果用户没有适当的授权级别,您可能不希望显示某些控件。

.NET MAUI使访问常用控件(如按钮)变得容易。其他常见控件(如文本输入字段、标签和日期选取器)也同样简单。但是,单个控件不足以为创建丰富的应用程序提供良好的平台。.NET MAUI还提供:

  • 用于设计页面的复杂布局引擎。
  • 用于创建丰富导航类型的多个页面类型,如抽屉。
  • 支持数据绑定,实现更优雅、更易于维护的开发模式。
  • 创建自定义处理程序以增强UI元素呈现方式的功能。
  • 直接访问本机API,并抽象出与UI分开的移动和桌面应用的许多常见需求。基本功能库使应用能够访问GPS、加速度计以及电池和网络状态等内容。通过此库,还可以获得数十种通用的移动开发传感器和服务。

问答题

Q: 哪个环境为WinUI 3应用程序提供运行时支持?

A:The Win32 runtime,Win32 provides runtime support for WinUI 3 apps built with .NET MAUI.

Q: 你可以用哪种标记语言来为一个.NET MAUI应用程序布置用户界面?

A:XAML,XAML is the language you use to lay out a .NET MAUI application's UI.

初识MAUI

https://github.com/TaylorShi/SeeUMaui

通过Visual Studio 2022 v17.3安装(推荐)

https://devblogs.microsoft.com/visualstudio/visual-studio-2022-17-3-is-now-available/

2022年8月9日,今天,我们很高兴地宣布,.NET Multi-platform App UI(.NET MAUI)已经从Visual Studio的预览版毕业,现在可以在Windows上的Visual Studio 2022发布频道中使用。现在,你可以在稳定产品中完全访问生产力功能,这些功能将帮助你更快地构建 .NET 客户端应用,并从单个代码库更有效地将 .NET 客户端应用交付到 Android、iOS、macOS 和 Windows。

image

在Visual Studio 2022 v17.3安装界面,我们会看到在"桌面应用和移动应用"分类中新增了一项".NET Multi-platform App UI开发",我们勾选它。

image

通过Visual Studio 2022预览版安装(可选)

在预览版的安装界面,我们会看到在"桌面应用和移动应用"分类中新增了一项".NET Multi-platform App UI开发",我们勾选它。

image

image

通过MAUI项目模板创建项目

在Visual Studio 2022创建项目时,选择C#语言,所有平台,类型选MAUI

image

创建示例项目

image

框架这次比较简单,从.NET 6.0开始,目前也只有.NET 6.0,哈哈。

image

创建后,就是一个单项目

image

编译运行首个项目

第一次运行,总会碰壁,首先就是要打开Windows 11的开发人员模式

image

image

image

第二次运行,可能还有一个报错,那就是要求接受Android SDK的许可证

image

直接双击这条消息,在弹出的许可协议对话框中点击接受按钮

image

愉快的跑起来了

image

看看项目结构

image

熟悉MAUI项目结构

image

其中:

  • Platforms: 包含MAUI项目支持的所有平台。
  • Resources: 项目中所用到的资源文件。如:图像、样式文件。
  • App.xaml: 跨平台移动应用程序的类。
  • AppShell/MainPage: 默认模板项目Shell导航窗口。
  • MauiProgram: 创建应用程序主机,初始化启动容器、服务以及构建。

启动MAUI项目(Android)

选择一个目标运行的平台, 启动项目。

image

如果选的是Android模拟器,那么它会要求先创建一个模拟器

image

image

启动MAUI项目(Windows)

目标这里选择Windows Machine,看到里面是关联了.net 6.0-windows10.0.19041.0这个目标。

image

运行后,看到基于WinUI3的窗体运行起来了。

image

我们也看到PlatformsWindows里面是我们熟悉的Xaml文件。

image

项目结构和启动

App.xaml

这个文件定义了应用程序将在XAML布局中使用的应用程序资源。默认资源位于Resources文件夹中,为.NET MAUI的每个内置控件定义了应用范围的颜色和默认样式。这里你会看到两个资源字典被合并在一起。

<?xml version = "1.0" encoding = "UTF-8" ?>
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:FirstMauiApp"
             x:Class="FirstMauiApp.App">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources/Styles/Colors.xaml" />
                <ResourceDictionary Source="Resources/Styles/Styles.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

image

App.xaml.cs

这是App.xaml文件的后台代码。这个文件定义了App类。这个类在运行时代表你的应用程序。这个类的构造函数创建了一个初始窗口,并将其分配给MainPage属性;这个属性决定了应用程序开始运行时显示的页面。此外,这个类使你能够覆盖常见的平台中立的应用程序生命周期事件处理程序。事件包括OnStart, OnResume, 和OnSleep。这些处理程序被定义为应用程序基类的成员。下面的代码显示了一些例子。

你也可以在应用程序第一次开始运行时覆盖平台特定的生命周期事件。这将在后面描述。

namespace FirstMauiApp
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();

            MainPage = new AppShell();
        }

        protected override void OnStart()
        {
            base.OnStart();
        }

        protected override void OnResume()
        {
            base.OnResume();
        }

        protected override void OnSleep()
        {
            base.OnSleep();
        }
    }
}

AppShell.xaml

这个文件是一个.NET MAUI应用程序的主要结构。.NET MAUI Shell提供了许多有利于多平台应用程序的功能,包括应用程序样式、基于URI的导航和布局选项,包括用于应用程序根目录的弹出导航和选项卡。默认模板提供在应用程序启动时填充的单个页面(或ShellContent)。

<?xml version="1.0" encoding="UTF-8" ?>
<Shell
    x:Class="FirstMauiApp.AppShell"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:FirstMauiApp"
    Shell.FlyoutBehavior="Disabled">

    <ShellContent
        Title="Home"
        ContentTemplate="{DataTemplate local:MainPage}"
        Route="MainPage" />

</Shell>

MainPage.xaml

这个文件包含了用户界面的定义。由MAUI App模板生成的示例应用程序包含两个标签、一个按钮和一个图像。这些控件是用一个VerticalStackLayout包在一个ScrollView中排列的。VerticalStackLayout控件使控件垂直排列(堆叠),如果视图太大,无法在设备上显示,ScrollView提供一个滚动条。我们的目的是让你用你自己的UI布局来替换这个文件的内容。如果你有一个多页的应用程序,你还可以定义更多的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="FirstMauiApp.MainPage">

    <ScrollView>
        <VerticalStackLayout
            Spacing="25"
            Padding="30,0"
            VerticalOptions="Center">

            <Image
                Source="dotnet_bot.png"
                SemanticProperties.Description="Cute dot net bot waving hi to you!"
                HeightRequest="200"
                HorizontalOptions="Center" />

            <Label
                Text="Hello, World!"
                SemanticProperties.HeadingLevel="Level1"
                FontSize="32"
                HorizontalOptions="Center" />

            <Label
                Text="Welcome to .NET Multi-platform App UI"
                SemanticProperties.HeadingLevel="Level2"
                SemanticProperties.Description="Welcome to dot net Multi platform App U I"
                FontSize="18"
                HorizontalOptions="Center" />

            <Button
                x:Name="CounterBtn"
                Text="Click me"
                SemanticProperties.Hint="Counts the number of times you click"
                Clicked="OnCounterClicked"
                HorizontalOptions="Center" />

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>

MainPage.xaml.cs

这是该页面的后台代码。在这个文件中,你定义了各种事件处理程序的逻辑和其他由页面上的控件触发的动作。本例代码为页面上的按钮实现了一个Clicked事件的处理程序。该代码简单地增加了一个计数器变量,并将结果显示在页面上的一个标签中。作为MAUI Essentials库的一部分而提供的Semantic服务支持可访问性。SemanticScreenReader类的静态Announce方法指定了用户选择按钮时屏幕阅读器所宣布的文本

namespace FirstMauiApp
{
    public partial class MainPage : ContentPage
    {
        int count = 0;

        public MainPage()
        {
            InitializeComponent();
        }

        private void OnCounterClicked(object sender, EventArgs e)
        {
            count++;

            if (count == 1)
                CounterBtn.Text = $"Clicked {count} time";
            else
                CounterBtn.Text = $"Clicked {count} times";

            SemanticScreenReader.Announce(CounterBtn.Text);
        }
    }
}

MauiProgram.cs

每个本地平台都有一个不同的起点,用于创建和初始化应用程序。你可以在项目的Platforms文件夹下找到这段代码。这段代码是针对特定平台的,但在最后它调用静态类MauiProgramCreateMauiApp方法。你使用CreateMauiApp方法通过创建一个应用程序构建器对象来配置应用程序。至少,你需要指定哪个类来描述你的应用程序。你可以通过应用程序生成器对象的UseMauiApp通用方法来完成这个任务;类型参数指定应用程序的类别。应用程序生成器还为一些任务提供了方法,如注册字体为依赖性注入配置服务为控件注册自定义处理程序等等。下面的代码显示了一个使用应用程序生成器来注册字体的例子。

image

using Microsoft.UI.Xaml;

// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.

namespace FirstMauiApp.WinUI
{
    /// <summary>
    /// Provides application-specific behavior to supplement the default Application class.
    /// </summary>
    public partial class App : MauiWinUIApplication
    {
        /// <summary>
        /// Initializes the singleton application object.  This is the first line of authored code
        /// executed, and as such is the logical equivalent of main() or WinMain().
        /// </summary>
        public App()
        {
            this.InitializeComponent();
        }

        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
    }
}
namespace FirstMauiApp
{
    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");
                });

            return builder.Build();
        }
    }
}

Platforms

这个文件夹包含特定平台的初始化代码文件和资源。有Android、iOS、MacCatalyst和Windows的文件夹。在运行时,应用程序以一种特定平台的方式启动。大部分的启动过程被MAUI库的内部结构所抽象出来,但是这些文件夹中的代码文件提供了一个机制来连接你自己的自定义初始化。重要的一点是,当初始化完成后,特定平台的代码调用MauiProgram.CreateMauiApp方法,然后创建并运行App对象,如前所述。例如,Android文件夹中的MainApplication.cs文件,iOSMacCatalyst文件夹中的AppDelegate.cs文件,以及Windows文件夹中的App.xaml.cs文件都包含重写内容。

image

protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
using Android.App;
using Android.Runtime;

namespace FirstMauiApp
{
    [Application]
    public class MainApplication : MauiApplication
    {
        public MainApplication(IntPtr handle, JniHandleOwnership ownership)
            : base(handle, ownership)
        {
        }

        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
    }
}
using Foundation;

namespace FirstMauiApp
{
    [Register("AppDelegate")]
    public class AppDelegate : MauiUIApplicationDelegate
    {
        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
    }
}
using Microsoft.Maui;
using Microsoft.Maui.Hosting;
using System;

namespace FirstMauiApp
{
    internal class Program : MauiApplication
    {
        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();

        static void Main(string[] args)
        {
            var app = new Program();
            app.Run(args);
        }
    }
}
using Microsoft.UI.Xaml;

// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.

namespace FirstMauiApp.WinUI
{
    /// <summary>
    /// Provides application-specific behavior to supplement the default Application class.
    /// </summary>
    public partial class App : MauiWinUIApplication
    {
        /// <summary>
        /// Initializes the singleton application object.  This is the first line of authored code
        /// executed, and as such is the logical equivalent of main() or WinMain().
        /// </summary>
        public App()
        {
            this.InitializeComponent();
        }

        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
    }
}

启动顺序

下图说明了.NET MAUI应用程序启动时的控制流:

image

项目资源

主项目的.csproj文件包括几个值得注意的部分。最初的PropertyGroup指定了项目所针对的平台框架,以及诸如应用程序的标题、ID、版本、显示版本和支持的操作系统等项目。你可以根据需要修改这些属性。

<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<TargetFrameworks>net6.0-android;net6.0-ios;net6.0-maccatalyst</TargetFrameworks>
		<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net6.0-windows10.0.19041.0</TargetFrameworks>
		<!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
		<!-- <TargetFrameworks>$(TargetFrameworks);net6.0-tizen</TargetFrameworks> -->
		<OutputType>Exe</OutputType>
		<RootNamespace>FirstMauiApp</RootNamespace>
		<UseMaui>true</UseMaui>
		<SingleProject>true</SingleProject>
		<ImplicitUsings>enable</ImplicitUsings>

		<!-- Display name -->
		<ApplicationTitle>FirstMauiApp</ApplicationTitle>

		<!-- App Identifier -->
		<ApplicationId>com.companyname.firstmauiapp</ApplicationId>
		<ApplicationIdGuid>3FB2193A-1892-48FB-80B1-13EC01FFC6FD</ApplicationIdGuid>

		<!-- Versions -->
		<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
		<ApplicationVersion>1</ApplicationVersion>

		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">14.2</SupportedOSPlatformVersion>
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">14.0</SupportedOSPlatformVersion>
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
		<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
	</PropertyGroup>
	
</Project>

在初始属性组下面的ItemGroup部分,你可以为应用程序在加载时出现的闪屏指定一个图像和颜色,在第一个窗口出现之前。你还可以设置应用程序使用的字体、图像和资产的默认位置。

<Project Sdk="Microsoft.NET.Sdk">

	<ItemGroup>
		<!-- App Icon -->
		<MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" Color="#512BD4" />

		<!-- Splash Screen -->
		<MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="128,128" />

		<!-- Images -->
		<MauiImage Include="Resources\Images\*" />
		<MauiImage Update="Resources\Images\dotnet_bot.svg" BaseSize="168,208" />

		<!-- Custom Fonts -->
		<MauiFont Include="Resources\Fonts\*" />

		<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
		<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
	</ItemGroup>

</Project>

在Visual Studio的Solution Explorer窗口中,你可以展开Resources文件夹来查看这些项目。你可以在这个文件夹和子文件夹中添加应用程序所需的任何其他字体、图像和其他图形资源。

image

当你的应用程序开始运行时,你应该向应用程序生成器对象注册任何添加到字体文件夹的字体。回顾一下,MauiProgram类中的CreateMauiApp方法通过ConfigureFonts方法来完成这一工作。

namespace FirstMauiApp
{
    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");
                });

            return builder.Build();
        }
    }
}

在这个例子中,AddFont方法将字体与OpenSansRegular这个名字联系起来。当你在页面的XAML描述中或在应用程序的资源字典中格式化项目时,你可以指定这种字体。

<Application>
    <Application.Resources>
        <ResourceDictionary>
            ...
            <Style TargetType="Button">
                ...
                <Setter Property="FontFamily" Value="OpenSansRegular" />
                ...
            </Style>

        </ResourceDictionary>
    </Application.Resources>
</Application>

使用Platforms文件夹下的Android和iOS文件夹中的资源文件夹,以获得Android和iOS平台的特定资源。

image

问答题

Q: 你应该在应用程序对象的哪个方法中创建应用程序所显示的初始窗口?

A:The constructor

Q: 你在哪里实现一个控件的事件处理程序的逻辑,例如一个按钮的Clicked事件?

A: You implement the logic in the code-behind file for the XAML page containing the control.

参考

posted @ 2022-06-16 19:20  TaylorShi  阅读(3333)  评论(0编辑  收藏  举报