Как программно изменить фоновую тему приложения Win 8.1 или Win 10 UWP?

У меня есть приложение для Windows Phone 8.1 и его версия для UWP. Я хотел бы динамически изменять фон приложений при его изменении в Windows.

Пример использования:

  1. Запустите приложение, фоновая тема темная.
  2. Нажмите кнопку домой на телефоне
  3. Измените фоновую тему на светлую
  4. Вернитесь в приложение (в основном переключитесь на него из фона)
  5. Тема приложения автоматически изменится на новую тему.

Я бы хотел, чтобы это было так, без перезагрузки. Я видел это в других приложениях, так что это должно быть каким-то образом, но я не могу понять.

Если требуется перезагрузка, это тоже хорошо, как решение B.

Спасибо.


person robcsi    schedule 17.11.2015    source источник


Ответы (3)


Я бы предложил создать одноэлементный класс настроек, который будет хранить состояние AppTheme и реализовывать интерфейс INotifyPropertyChanged.

public class Settings : INotifyPropertyChanged
{
    private static volatile Settings instance;
    private static readonly object SyncRoot = new object();
    private ElementTheme appTheme;

    private Settings()
    {
        this.appTheme = ApplicationData.Current.LocalSettings.Values.ContainsKey("AppTheme")
                            ? (ElementTheme)ApplicationData.Current.LocalSettings.Values["AppTheme"]
                            : ElementTheme.Default;
    }

    public static Settings Instance
    {
        get
        {
            if (instance != null)
            {
                return instance;
            }

            lock (SyncRoot)
            {
                if (instance == null)
                {
                    instance = new Settings();
                }
            }

            return instance;
        }
    }

    public ElementTheme AppTheme
    {
        get
        {
            return this.appTheme;
        }

        set
        {
            ApplicationData.Current.LocalSettings.Values["AppTheme"] = (int)value;
            this.OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Затем вы можете создать параметры свойства на странице, которые вернут значение синглтона и привяжут RequestedTheme страницы к свойству AppTheme.

<Page
    x:Class="SamplePage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    RequestedTheme="{x:Bind Settings.AppTheme, Mode=OneWay}">
person Maxim Nikonov    schedule 17.11.2015
comment
Как мне получить тему Windows (темную или светлую) при запуске приложения, чтобы я мог установить это значение в Settings.Apptheme? - person robcsi; 21.11.2015
comment
При запуске вы можете использовать свойство RequestedTheme приложения, оно будет иметь тип ApplicationTheme вместо ElementTheme, но будет иметь те же значения перечисления. - person Maxim Nikonov; 23.11.2015
comment
Большое спасибо за информацию. Тем временем я обнаружил, что если я не устанавливаю App.RequestedTheme в файле app.xaml, я получаю то, что искал. То есть тема приложения меняется на ту, что задана в ОС. Раньше я думал, что мне нужно сделать это самому из кода. Тем не менее, оба ваших ответа очень помогли. - person robcsi; 25.11.2015
comment
Когда я пытаюсь это сделать, я получаю сообщение об ошибке в xaml о недопустимом пути привязки «Settings.AppTheme»: свойство «Settings» не может быть найдено для типа «MainPage». - person AbsoluteSith; 26.04.2016

Используйте ThemeResource вместо StaticResource для цветов, которые могут измениться. во время выполнения:

{ThemeResource ApplicationPageBackgroundThemeBrush}
person sibbl    schedule 17.11.2015

Ответ на мой вопрос заключается в том, что мне не нужно устанавливать свойство App.RequestedTheme в файле app.xaml, чтобы тема приложения соответствовала теме ОС.

Я просто подумал, что это нужно делать вручную по коду.

person robcsi    schedule 25.11.2015