如何以编程方式更改Win 8.1或Win 10 UWP应用程序的背景主题?

时间:2015-11-17 09:12:52

标签: c# windows windows-phone-8.1 themes uwp

我有一个适用于Windows Phone 8.1的应用程序及其UWP版本。我想在Windows中更改应用程序时动态更改应用程序的背景。

用例将是:

  1. 启动应用,背景主题很暗。
  2. 按手机上的主屏幕按钮
  3. 将背景主题更改为浅色
  4. 返回应用程序(基本上从后台切换到它)
  5. 应用程序的主题会自动更改为新主题
  6. 我希望这样做,不需要重启。我已经在其他应用中看到了这一点,所以它必须以某种方式存在,但我无法弄明白。

    如果需要重新启动,那么解决方案B也可以。

    感谢。

3 个答案:

答案 0 :(得分: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));
    }
}

然后,你可以在页面上创建属性设置,它将返回单例的值并将页面的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}">

答案 1 :(得分:3)

对于可能在运行时更改的颜色,请使用ThemeResource代替StaticResource

{ThemeResource ApplicationPageBackgroundThemeBrush}

答案 2 :(得分:0)

我的问题的答案是我不需要在app.xaml文件中设置App.RequestedTheme属性,以使应用程序的主题遵循操作系统之一。

我只是认为需要通过代码手动完成。