2015-11-17 2 views
4

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

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

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

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

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

Спасибо.

ответ

5

Я хотел бы предложить, чтобы создать настройки одноплодного класс, который будет хранить 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)); 
    } 
} 

Чем , вы можете создать параметры свойства на странице, которая вернет значение singleton и привяжет свойство RequestedTheme of page к 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}"> 
+0

Как получить тему Windows (темный или светлый) при запуске приложения, чтобы я мог установить это значение в Settings.Apptheme? – robcsi

+0

В начале вы можете использовать свойство RequestedTheme приложения, оно будет типа ApplicationTheme вместо ElementTheme, но оно будет иметь одинаковые значения перечисления –

+0

Большое спасибо за информацию. Тем временем я обнаружил, что если я не установлю App.RequestedTheme в файле app.xaml, я получаю то, что искал. То есть тема приложения изменяется на тот, который установлен в ОС. Раньше я думал, что мне нужно сделать это сам из кода. Тем не менее, оба ваших ответа оказали большую помощь. – robcsi

3

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

{ThemeResource ApplicationPageBackgroundThemeBrush} 
0

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

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

Смежные вопросы