Содержание
Тема оформления, с точки зрения, разработки приложений .NET MAUI может рассматриваться как набор стилей оформления элементов управления. Многие платформы обычно поддерживают несколько тем оформления, например, светлую и темную. При этом, системная тема может сменится по самым различным причинам — вручную пользователем, в зависимости от времени суток и внешних факторов, например, освещенности. Приложения .NET MAUI могут реагировать на изменение системной темы на устройстве.
Расширение разметки AppThemeBinding
Расширение AppThemeBinding разметки позволяет использовать ресурс, в зависимости от текущей системной темы.
Расширение разметки AppThemeBinding использует следующие свойства:
| Свойство | Тип | Описание |
Default |
object |
Ресурс, используемый по умолчанию |
Light |
object |
Ресурс, который будет использоваться, если на устройстве установлена светлая тема |
Dark |
object |
Ресурс, который будет использоваться, если на устройстве установлена темная тема |
Value |
object |
Ресурс, который используется в настоящее время |
Например, создадим новое приложение .NET MAUI и изменим код страницы 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="MauiApp10.MainPage"
Background="{AppThemeBinding Dark={StaticResource BackgroundForDark}, Light={StaticResource BackgroundForLight}}">
<ContentPage.Resources>
<ResourceDictionary>
<Color x:Key="TextForLight">Black</Color>
<Color x:Key="TextForDark">White</Color>
<Color x:Key="BackgroundForLight">LightGreen</Color>
<Color x:Key="BackgroundForDark">DarkBlue</Color>
</ResourceDictionary>
</ContentPage.Resources>
<ScrollView>
<VerticalStackLayout
Padding="30,0"
Spacing="25">
<Label
Text="Hello, World!"
TextColor="{AppThemeBinding Dark={StaticResource TextForDark}, Light={StaticResource TextForLight}}"
SemanticProperties.HeadingLevel="Level1" />
</VerticalStackLayout>
</ScrollView>
</ContentPage>
Здесь мы определили четыре ресурса — по два для каждой темы оформления: цвет текста и фон страницы для светлой темы и цвет текста и цвет фона страницы для темной темы.
<ContentPage.Resources>
<ResourceDictionary>
<Color x:Key="TextForLight">Black</Color>
<Color x:Key="TextForDark">White</Color>
<Color x:Key="BackgroundForLight">LightGreen</Color>
<Color x:Key="BackgroundForDark">DarkBlue</Color>
</ResourceDictionary>
</ContentPage.Resources>
Эти темы мы используем в AppThemeBinding для метки:
<Label
Text="Hello, World!"
TextColor="{AppThemeBinding Dark={StaticResource TextForDark}, Light={StaticResource TextForLight}}"
SemanticProperties.HeadingLevel="Level1" />
и для страницы
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp10.MainPage"
Background="{AppThemeBinding Dark={StaticResource BackgroundForDark}, Light={StaticResource BackgroundForLight}}">
Теперь наше приложение будет реагировать на изменение системной темы оформления. Запустите приложение, например, в Windows. Если у вас в этот момент установлена светлая системная тема, то вы увидите следующую страницу приложения:
Теперь, можно не закрывая приложение, перейти в настройки системы и выбрать темную тему оформления. Вы увидите, что наше приложение среагировало на это изменение и страница приложения станет вот такой:
Аналогичным образом м можем применять не только отдельные ресурсы, но и стили оформления. Для этого достаточно определить в словаре ресурсов несколько стилей и использовать их с AppThemeBinding при назначении свойству Style элемента управления, например:
<?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="MauiApp10.MainPage"
Background="{AppThemeBinding Dark={StaticResource BackgroundForDark}, Light={StaticResource BackgroundForLight}}">
<ContentPage.Resources>
<ResourceDictionary>
<Color x:Key="BackgroundForLight">LightGreen</Color>
<Color x:Key="BackgroundForDark">DarkBlue</Color>
<Style TargetType="Label" x:Key="light">
<Setter Property="TextColor" Value="DarkBlue"></Setter>
</Style>
<Style TargetType="Label" x:Key="dark">
<Setter Property="TextColor" Value="LightBlue"></Setter>
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<ScrollView>
<VerticalStackLayout
Padding="30,0"
Spacing="25">
<Label
Text="Hello, World!"
Style="{AppThemeBinding Dark={StaticResource dark}, Light={StaticResource light}}"
SemanticProperties.HeadingLevel="Level1" />
</VerticalStackLayout>
</ScrollView>
</ContentPage>
Теперь для метки в зависимости от системной темы будет применяться стиль.
Итого
Для того, чтобы приложение меняло оформление элементов управления в зависимости от установленной системной темы используется расширение разметки AppThemeBinding в котором мы можем указать как отдельные ресурсы для разных тем, так и стили целиком.

