How to programmatically change background theme of Win 8.1 or Win 10 UWP app?

柔情痞子 提交于 2019-12-23 13:24:39

问题


I have an app for Windows Phone 8.1 and a UWP version of it. I'd like to change the background of the apps dynamically when it is changed in Windows.

Use case would be:

  1. Start the app, the background theme is dark.
  2. Press the home button on the phone
  3. Change the background theme to light
  4. Go back to the app (basically switch to it from the background)
  5. The theme of the app would change automatically to the new theme

I'd like it to be done like this, without a restart. I've seen this in other apps, so it has to be possible somehow, but I can't figure out.

If a restart is required, that is fine too as solution B.

Thanks.


回答1:


I would suggest to create settings singleton class that will store AppTheme state and implements INotifyPropertyChanged interface

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));
    }
}

Than, you can create Property Settings on page, that will return value of singleton and bind RequestedTheme of Page to AppTheme property

<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}">



回答2:


Use ThemeResource instead of StaticResource for the colors which might change at runtime:

{ThemeResource ApplicationPageBackgroundThemeBrush}



回答3:


The answer to my question is that I don't need to set the App.RequestedTheme property in the app.xaml file in order to have the theme of the application follow the one of the OS.

I just thought that it needed to be done manually by code.



来源:https://stackoverflow.com/questions/33753017/how-to-programmatically-change-background-theme-of-win-8-1-or-win-10-uwp-app

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!