.NET 多平台应用程序 UI (MAUI) 预览版 14 现已在 Visual Studio 2022 17.2 预览版 2 中提供。此版本包括大量问题解决方案和已完成的功能,以及一项将受到桌面开发人员欢迎的新功能: 菜单栏。虽然桌面应用程序导航和菜单通常被设计到许多现代应用程序的内容窗口中(想想 Teams 左侧边栏或地图顶部选项卡),但仍然非常需要位于 Windows 应用程序窗口顶部的传统菜单,并且在 macOS 的标题栏中。

.NET MAUI 预览版 14 已发布_Text

对于任何ContentPage当前托管在ShellNavigationPage. 首先将 a 添加MenuBarItem到页面的MenuBarItems集合中,然后MenuFlyoutItem为直接子级添加,或MenuFlyoutSubItem为 other 的容器添加MenuFlyoutItem

<ContentPage.MenuBarItems>
    <MenuBarItem Text="File">
        <MenuFlyoutItem Text="Quit" Command="{Binding QuitCommand}"/>
    </MenuBarItem>
    <MenuBarItem Text="Locations">
        <MenuFlyoutSubItem Text="Change Location">
            <MenuFlyoutItem Text="Boston, MA"/>
            <MenuFlyoutItem Text="Redmond, WA"/>
            <MenuFlyoutItem Text="St. Louis, MO"/>
        </MenuFlyoutSubItem>
        <MenuFlyoutItem Text="Add a Location" Command="{Binding AddLocationCommand}"/>
    </MenuBarItem>
    <MenuBarItem Text="View">
        <MenuFlyoutItem Text="Refresh" Command="{Binding RefreshCommand}"/>
        <MenuFlyoutItem Text="Toggle Light/Dark Mode" Command="{Binding ToggleModeCommand}"/>
    </MenuBarItem>
</ContentPage.MenuBarItems>

预览版 14 的其他亮点包括:

  • 设备和 Essentials 协调,以及 Essentials API 接口
  • 外壳 WinUI
  • 图像缓存
  • 原生 -> 平台重命名
  • 形状
  • StrokeShape 使用字符串
  • Web 视图 cookie
  • 菜单栏
  • RTL 窗口

在梳理您在以前的 .NET MAUI 版本中的反馈时,我们注意到一个主题,例如“如何添加 FilePicker”、“如何检查我的应用程序的连接性”以及其他此类“基本”应用程序任务不是专门的用户界面。

超越 UI:访问平台 API

在 .NET MAUI 中是一组位于 Microsoft.Maui.Essentials 命名空间中的 API,它们解锁了常用功能,从而为非 UI 需求带来与快速创建漂亮 UI 相同的效率。Essentials 最初是 Xamarin 生态系统中的一个库,现在已融入 .NET MAUI 并托管在同一个dotnet/maui存储库中(以防您想知道在哪里记录您的宝贵反馈)。有了它,您可以访问以下功能:

加速度计

应用操作

应用信息

应用主题

晴雨表

电池

剪贴板

颜色转换器

罗盘

连接性

联系人

检测震动

显示信息

设备信息

电子邮件

文件选择器

文件系统助手

手电筒

地理编码

地理位置

陀螺仪

触觉反馈

启动器

磁力计

主线程

地图

媒体选择器

打开浏览器

方向传感器

权限

电话拨号器

平台扩展

优先

截屏

安全存储

分享

短信

文字转语音

单位转换器

版本跟踪

颤动

网络验证器

好多啊!每个 API 都使用共同的模式,所以让我们通过介绍的方式重点关注其中的几个。

文件选择器

桌面平台通常可能有一个名为 FilePicker 或类似名称的 UI 控件,但并非所有平台都有。移动平台没有,但仍然可以从任何 UI 元素执行操作,例如简单的Button.

<Button Text="Select a File" Clicked="OnClicked" />

现在我们可以使用 Maui.Essentials API 来启动文件选择过程并处理回调。

async void OnClicked(object sender, EventArgs args)
{
    var result = await PickAndShow(PickOptions.Default);
}

async Task<FileResult> PickAndShow(PickOptions options)
{
    try
    {
        var result = await FilePicker.PickAsync(options);
        if (result != null)
        {
            Text = $"File Name: {result.FileName}";
            if (result.FileName.EndsWith("jpg", StringComparison.OrdinalIgnoreCase) ||
                result.FileName.EndsWith("png", StringComparison.OrdinalIgnoreCase))
            {
                var stream = await result.OpenReadAsync();
                Image = ImageSource.FromStream(() => stream);
            }
        }

        return result;
    }
    catch (Exception ex)
    {
        // 用户取消或出现问题
    }

    return null;
}

方便地提供用于配置文件选择标准的PickOptions选项,例如文件类型FilePickerFileType

  • FilePickerFileType.Images
  • 文件选择器文件类型.Jpeg
  • 文件选择器文件类型.pdf
  • 文件选择器文件类型.Png
  • FilePickerFileType.Videos

连接性

这是移动设备的一项重要功能,但对桌面设备同样有用,可以同时处理离线和在线场景。事实上,如果您曾经尝试将应用程序发布到 Apple App Store,您可能会遇到这种常见的拒绝,因为在尝试网络呼叫之前未检测到连接状态。

var current = Connectivity.NetworkAccess;

if (current == NetworkAccess.Internet)
{
    // 能够连接,做API调用
}else{
    // 无法连接,提醒用户
}

某些服务需要对每个平台进行一些配置。在这种情况下,iOS、macOS 和 Windows 不需要任何东西,但 Android 需要将一个简单的权限添加到“AndroidManifest.xml”中,您可以在 .NET MAUI 解决方案的 Platforms/Android 路径中找到该权限。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />