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

Posted

技术标签:

【中文标题】如何以编程方式更改 Win 8.1 或 Win 10 UWP 应用的背景主题?【英文标题】:How to programmatically change background theme of Win 8.1 or Win 10 UWP app? 【发布时间】:2016-02-18 14:13:15 【问题描述】:

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

用例是:

    启动应用,背景为暗色。 按手机上的主页按钮 将背景主题更改为浅色 回到应用程序(基本上从后台切换到它) 应用的主题将自动更改为新主题

我希望它像这样完成,而不需要重新启动。我在其他应用程序中看到过这个,所以它必须以某种方式成为可能,但我无法弄清楚。

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

谢谢。

【问题讨论】:

【参考方案1】:

我建议创建设置单例类来存储 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">

【讨论】:

如何在应用程序启动时获取 Windows 主题(深色或浅色)以便我可以将该值设置为 Settings.Apptheme? 启动时可以使用应用程序的 RequestedTheme 属性,它将是 ApplicationTheme 类型而不是 ElementTheme,但它具有相同的枚举值 非常感谢您提供的信息。同时我发现,如果我没有在 app.xaml 文件中设置 App.RequestedTheme,我就会得到我想要的东西。也就是说,应用程序的主题更改为操作系统中设置的主题。之前我曾想过我需要自己从代码中做到这一点。不过,您的两个回答都帮了大忙。 当我尝试这个时,我在 xaml 上收到一个错误,指出“无效的绑定路径 'Settings.AppTheme':在类型 'MainPage' 上找不到属性 'Settings'”【参考方案2】:

使用ThemeResource 而不是StaticResource 来表示可能在运行时改变的颜色:

ThemeResource ApplicationPageBackgroundThemeBrush

【讨论】:

【参考方案3】:

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

我只是觉得需要通过代码手动完成。

【讨论】:

以上是关于如何以编程方式更改 Win 8.1 或 Win 10 UWP 应用的背景主题?的主要内容,如果未能解决你的问题,请参考以下文章

Windows 7 或 Windows 8.1用户如何免费升级至Windows 10?

Win7/8.1/10去掉桌面快捷方式小箭头

如何以编程方式设置 UWP 应用的方向

win7所有程序都只能用管理员身份运行

什么情况下需要检测预装Win8/8.1电脑内置激活密钥(即Win8/8.1 OEM key)?

如何自动批量编辑 Win 8.1 目录中的文本文件?