XAML 中特定于平台的值

已完成

应用在每个平台上的视觉体验各不相同。 通常需要根据所使用的视觉元素对每个平台的 UI 进行微调。 使用 .NET MAUI 可以根据这些设备属性管理应用的布局。

本单元介绍 .NET MAUI 提供的功能,这些功能让你可以根据运行应用的平台调整应用的 UI。

使用 Device 类

DeviceInfo 类是一个实用工具类,它为运行应用的设备提供特定于设备的信息。 它通过一组属性公开此信息。 最重要的属性是 DeviceInfo.Platform,该属性返回一个指示当前使用的设备类型的字符串:AndroidiOSWinUImacOS

参考以下示例场景来确定何时可以使用此功能。 某个 .NET MAUI iOS 应用的默认行为存在一个问题:添加到页面中的内容会占据屏幕顶部的 iOS 状态栏。 你想要改变这种行为。 最简单的解决方法是将页面中的内容下移。 在上一个练习中创建的 Notes 解决方案解决此问题的方法是将 VerticalStackLayout 控件的 Padding 属性设置为将内容下移 60 点:

<VerticalStackLayout x:Name="MyStackLayout" Padding="30,60,30,30">
    ...
</VerticalStackLayout>

问题在于,此解决方法只适用于 iOS。 在 Android 和 WinUI 上将内容下移这么多个点会导致页面顶部的屏幕空间浪费。

可以查询 DeviceInfo.Platform 属性来解决此显示问题。 可将以下代码添加到应用的页面构造函数,以扩大页面顶部的填充(但仅适用于 iOS):

MyStackLayout.Padding = 
    DeviceInfo.Platform == DevicePlatform.iOS
        ? new Thickness(30, 60, 30, 30) // Shift down by 60 points on iOS only
        : new Thickness(30); // Set the default margin to be 30 points

注意

DevicePlatform.iOS 是一个 DevicePlatform 结构,它返回字符串值 iOS。 其他支持的平台也提供等效的属性。 应使用这些属性,而不要与硬编码的字符串相比较;这是一种良好的做法,如果将来其中某些字符串值更改,它可为代码提供证明。

此代码可有效运行,但它位于该页的代码隐藏文件中。 填充是特定于用户界面的值。 可以说,从 XAML(而不是代码隐藏)执行此操作更适合且更方便。

使用 OnPlatform 标记扩展

.NET MAUI XAML 提供 OnPlatform 标记扩展,允许你从 XAML 代码内部检测运行时平台。 可将此标记扩展作为设置属性值的 XAML 代码的一部分应用。 该扩展要求提供属性类型,以及一系列 On Platform 块,可在其中根据平台设置属性值。

注意

OnPlatform 标记扩展是泛型的;它采用一个类型参数。 TypeArguments 特性指定的类型可确保使用正确的扩展类型。

可按如下所示设置 Padding 属性。 请注意,Padding 属性的类型为 Thickness

<VerticalStackLayout>
    <VerticalStackLayout.Padding>
        <OnPlatform x:TypeArguments="Thickness">
            <On Platform="iOS" Value="30,60,30,30" />
        </OnPlatform>
    </VerticalStackLayout.Padding>
    <!--XAML for other controls goes here -->
    ...
</VerticalStackLayout>

对于 iOS 以外的平台,填充将保持设置为默认值“0,0,0,0”。 对于 WinUI 和 Android,可以使用附加的 OnPlatform 块将填充设置为 30 点:

<VerticalStackLayout>
    <VerticalStackLayout.Padding>
        <OnPlatform x:TypeArguments="Thickness">
            <On Platform="iOS" Value="30,60,30,30" />
            <On Platform="Android" Value="30" />
            <On Platform="WinUI" Value="30" />
        </OnPlatform>
    </VerticalStackLayout.Padding>
    ...
</VerticalStackLayout>

可将这种方法应用于其他属性。 以下示例将 iOS、Android 和 Windows 中页面上的堆积布局的背景颜色分别更改为 Silver、Green 和 Yellow。

<VerticalStackLayout>
    ...
    <VerticalStackLayout.BackgroundColor>
        <OnPlatform x:TypeArguments="Color">
            <On Platform="iOS" Value="Silver" />
            <On Platform="Android" Value="Green" />
            <On Platform="WinUI" Value="Yellow" />
        </OnPlatform>
    </VerticalStackLayout.BackgroundColor>
    ...
</VerticalStackLayout>

此语法有点冗长,但 OnPlatform 扩展还可以使用一种简化的语法。 可按如下所示简化设置填充的示例:

<VerticalStackLayout Padding="{OnPlatform iOS='30,60,30,30', Default='30'}">
    <!--XAML for other controls goes here -->
</VerticalStackLayout>

可以连同任何特定于平台的值一起指定属性的默认值。 在此格式中,类型参数是从 OnPlatform 属性应用到的属性推理出来的。

若要设置背景颜色,可以使用此 XAML 片段代替前面的第二个示例:

<VerticalStackLayout BackgroundColor="{OnPlatform WinUI=Yellow, iOS=Silver, Android=Green}">
    ...
</VerticalStackLayout>

知识检查

1.

可以在 XAML 代码中使用哪个标记扩展来检测运行应用的平台?

2.

OnPlatform 扩展的 TypeArguments 属性的作用是什么?