Udostępnij za pośrednictwem


Reagowanie na zmiany motywu systemu w Xamarin.Forms aplikacjach

Urządzenia zazwyczaj obejmują jasne i ciemne motywy, które odwołują się do szerokiego zestawu preferencji wyglądu, które można ustawić na poziomie systemu operacyjnego. Aplikacje powinny uwzględniać te motywy systemowe i reagować natychmiast po zmianie motywu systemu.

Motyw systemowy może ulec zmianie z różnych powodów, w zależności od konfiguracji urządzenia. Obejmuje to jawną zmianę motywu systemowego przez użytkownika, zmianę z powodu pory dnia i zmianę z powodu czynników środowiskowych, takich jak małe światło.

Xamarin.Forms aplikacje mogą reagować na zmiany motywu systemu, zużywając zasoby przy AppThemeBinding użyciu rozszerzenia znaczników oraz SetAppThemeColor metod rozszerzeń i SetOnAppTheme<T> .

Aby reagować na zmianę motywu systemowego, należy spełnić Xamarin.Forms następujące wymagania:

  • Xamarin.Forms 4.6.0.967 lub nowsza.
  • System iOS 13 lub nowszy.
  • System Android 10 (interfejs API 29) lub nowszy.
  • Kompilacja platformy UWP 14393 lub nowsza.
  • system macOS 10.14 lub nowszy.

Na poniższych zrzutach ekranu przedstawiono strony motywów dla jasnych i ciemnych motywów systemowych w systemach iOS i Android:

Zrzut ekranu przedstawiający stronę główną aplikacji tematyce w systemach iOS i AndroidZrzut ekranu przedstawiający stronę szczegółów aplikacji tematyce w systemach iOS i Android

Definiowanie i używanie zasobów motywu

Zasoby dla motywów jasnych i ciemnych mogą być używane z AppThemeBinding rozszerzeniem znaczników oraz SetAppThemeColor metodami rozszerzenia i SetOnAppTheme<T> . Dzięki tym podejściom zasoby są automatycznie stosowane na podstawie wartości bieżącego motywu systemowego. Ponadto obiekty, które zużywają te zasoby, są automatycznie aktualizowane, jeśli motyw systemowy ulegnie zmianie podczas działania aplikacji.

Rozszerzenie znaczników AppThemeBinding

AppThemeBinding Rozszerzenie znaczników umożliwia korzystanie z zasobu, takiego jak obraz lub kolor, na podstawie bieżącego motywu systemu:

<ContentPage ...>
    <StackLayout Margin="20">
        <Label Text="This text is green in light mode, and red in dark mode."
               TextColor="{AppThemeBinding Light=Green, Dark=Red}" />
        <Image Source="{AppThemeBinding Light=lightlogo.png, Dark=darklogo.png}" />
    </StackLayout>
</ContentPage>

W tym przykładzie kolor tekstu pierwszego Label jest ustawiony na zielony, gdy urządzenie używa jego motywu jasnego i jest ustawione na czerwony, gdy urządzenie używa ciemnego motywu. Podobnie wyświetla Image inny plik obrazu na podstawie bieżącego motywu systemowego.

Ponadto zasoby zdefiniowane w obiekcie ResourceDictionary mogą być używane z StaticResource rozszerzeniem znaczników:

<ContentPage ...>
    <ContentPage.Resources>

        <!-- Light colors -->
        <Color x:Key="LightPrimaryColor">WhiteSmoke</Color>
        <Color x:Key="LightSecondaryColor">Black</Color>

        <!-- Dark colors -->
        <Color x:Key="DarkPrimaryColor">Teal</Color>
        <Color x:Key="DarkSecondaryColor">White</Color>

        <Style x:Key="ButtonStyle"
               TargetType="Button">
            <Setter Property="BackgroundColor"
                    Value="{AppThemeBinding Light={StaticResource LightPrimaryColor}, Dark={StaticResource DarkPrimaryColor}}" />
            <Setter Property="TextColor"
                    Value="{AppThemeBinding Light={StaticResource LightSecondaryColor}, Dark={StaticResource DarkSecondaryColor}}" />
        </Style>

    </ContentPage.Resources>

    <Grid BackgroundColor="{AppThemeBinding Light={StaticResource LightPrimaryColor}, Dark={StaticResource DarkPrimaryColor}}">
      <Button Text="MORE INFO"
              Style="{StaticResource ButtonStyle}" />
    </Grid>    
</ContentPage>    

W tym przykładzie kolor Grid tła elementu i Button styl zmienia się w zależności od tego, czy urządzenie korzysta z jego motywu jasnego, czy ciemnego motywu.

Aby uzyskać więcej informacji na temat AppThemeBinding rozszerzenia znaczników, zobacz AppThemeBinding markup extension (Rozszerzenie znaczników AppThemeBinding).

Metody rozszerzeń

Xamarin.Forms zawiera SetAppThemeColor metody i SetOnAppTheme<T> rozszerzenia, które umożliwiają VisualElement obiektom reagowanie na zmiany motywu systemowego.

Metoda SetAppThemeColor umożliwia Color określenie obiektów, które zostaną ustawione na właściwości docelowej na podstawie bieżącego motywu systemu:

Label label = new Label();
label.SetAppThemeColor(Label.TextColorProperty, Color.Green, Color.Red);

W tym przykładzie kolor Label tekstu elementu jest ustawiony na zielony, gdy urządzenie korzysta z jego motywu jasnego i jest ustawione na czerwony, gdy urządzenie używa ciemnego motywu.

Metoda SetOnAppTheme<T> umożliwia określenie obiektów typu T , które zostaną ustawione na właściwości docelowej na podstawie bieżącego motywu systemowego:

Image image = new Image();
image.SetOnAppTheme<FileImageSource>(Image.SourceProperty, "lightlogo.png", "darklogo.png");

W tym przykładzie wyświetlane lightlogo.pngImage informacje o tym, kiedy urządzenie korzysta z jego motywu jasnego, a darklogo.png kiedy urządzenie korzysta z ciemnego motywu.

Wykrywanie bieżącego motywu systemowego

Bieżący motyw systemowy można wykryć, uzyskując wartość Application.RequestedTheme właściwości:

OSAppTheme currentTheme = Application.Current.RequestedTheme;

Właściwość RequestedTheme zwraca element członkowski OSAppTheme wyliczenia. Wyliczenie OSAppTheme definiuje następujące elementy członkowskie:

  • Unspecified, który wskazuje, że urządzenie korzysta z nieokreślonego motywu.
  • Light, który wskazuje, że urządzenie korzysta z jego motywu lekkiego.
  • Dark, który wskazuje, że urządzenie korzysta z ciemnego motywu.

Ustawianie bieżącego motywu użytkownika

Motyw używany przez aplikację można ustawić za pomocą Application.UserAppTheme właściwości , która jest typu OSAppTheme, niezależnie od tego, który motyw systemowy jest obecnie operacyjny:

Application.Current.UserAppTheme = OSAppTheme.Dark;

W tym przykładzie aplikacja jest ustawiona na użycie motywu zdefiniowanego dla trybu ciemnego systemu, niezależnie od tego, który motyw systemowy jest obecnie operacyjny.

Uwaga

UserAppTheme Ustaw właściwość na OSAppTheme.Unspecified wartość domyślną na motyw systemu operacyjnego.

Reagowanie na zmiany motywu

Motyw systemowy na urządzeniu może ulec zmianie z różnych powodów, w zależności od konfiguracji urządzenia. Xamarin.Forms aplikacje mogą być powiadamiane, gdy motyw systemowy ulegnie zmianie, obsługując Application.RequestedThemeChanged zdarzenie:

Application.Current.RequestedThemeChanged += (s, a) =>
{
    // Respond to the theme change
};

Obiekt AppThemeChangedEventArgs , który towarzyszy RequestedThemeChanged zdarzeniu, ma jedną właściwość o nazwie RequestedTheme, typu OSAppTheme. Tę właściwość można zbadać, aby wykryć żądany motyw systemowy.

Ważne

Aby odpowiedzieć na zmiany motywu w systemie Android, należy uwzględnić flagę ConfigChanges.UiMode w atrybucie ActivityMainActivity klasy.