Windows phone 8 即使手机的主题发生变化,如何始终使用一个主题

Posted

技术标签:

【中文标题】Windows phone 8 即使手机的主题发生变化,如何始终使用一个主题【英文标题】:Windows phone 8 How to be always on one theme even if phone's theme changed 【发布时间】:2013-07-09 02:41:38 【问题描述】:

我的应用程序通常是为dark 主题设计的,而我正在使用StaticResources 因此,如果用户将手机的主题更改为light,应用程序就会变得不可读和不可用。

我尝试手动更改每个元素的颜色并避免使用StaticResources 之类的东西:

Style="StaticResource PhoneTextLargeStyle"

StaticResources 用于字体和颜色。但这是一项艰苦的工作。

如果我认为手机主题为暗色,如何将主题全局更改为我的应用? (这是一个 windows phone 8 应用程序)

【问题讨论】:

【参考方案1】:

更新: 自 Windows Phone 8.1 发布以来,您可以在任何控件上设置 RequestedTheme 属性,甚至可以在应用程序级别覆盖用户在设置

强制使用 Light 主题的示例:

在代码中,在 App 类的构造函数中:

/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
public sealed partial class App : Application

    private TransitionCollection transitions;

    /// <summary>
    /// Initializes the singleton application object.  This is the first line of authored code
    /// executed, and as such is the logical equivalent of main() or WinMain().
    /// </summary>
    public App()
    
        this.RequestedTheme = ApplicationTheme.Light;

        this.InitializeComponent();
        this.Suspending += this.OnSuspending;
    

在 XAML 中

<Application
    x:Class="App26.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    RequestedTheme="Light"
    xmlns:local="using:App26">
</Application>

对于旧的 Windows Phone 8 应用程序模型:

在设计指南中当然建议使用主题资源来确保您的应用适用于任何主题和强调色。

但是如果你真的想强制使用黑暗主题,这里是 Rudy Huyn 在他的博客上提供的解决方案:http://www.rudyhuyn.com/blog/2013/01/18/forcer-un-theme-sous-windows-phone-8/

想法是在您的 App 类中添加一个方法,该方法将使用深色主题的颜色覆盖所有系统画笔:

private void DarkTheme()

    ((SolidColorBrush)Resources["PhoneRadioCheckBoxCheckBrush"]).Color = ((SolidColorBrush)Resources["PhoneRadioCheckBoxBorderBrush"]).Color = ((SolidColorBrush)Resources["PhoneForegroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneBackgroundBrush"]).Color = Color.FromArgb(0xFF, 0x00, 0x00, 0x00);
    ((SolidColorBrush)Resources["PhoneContrastForegroundBrush"]).Color = Color.FromArgb(0xFF, 0x00, 0x00, 0x00);
    ((SolidColorBrush)Resources["PhoneContrastBackgroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneDisabledBrush"]).Color = Color.FromArgb(0x66, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneProgressBarBackgroundBrush"]).Color = Color.FromArgb(0x19, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneTextCaretBrush"]).Color = Color.FromArgb(0xFF, 0x00, 0x00, 0x00);
    ((SolidColorBrush)Resources["PhoneTextBoxBrush"]).Color = Color.FromArgb(0xBF, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneTextBoxForegroundBrush"]).Color = Color.FromArgb(0xFF, 0x00, 0x00, 0x00);
    ((SolidColorBrush)Resources["PhoneTextBoxEditBackgroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneTextBoxReadOnlyBrush"]).Color = Color.FromArgb(0x77, 0x00, 0x00, 0x00);
    ((SolidColorBrush)Resources["PhoneSubtleBrush"]).Color = Color.FromArgb(0x99, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneTextBoxSelectionForegroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneButtonBasePressedForegroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneTextHighContrastBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneTextMidContrastBrush"]).Color = Color.FromArgb(0x99, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneTextLowContrastBrush"]).Color = Color.FromArgb(0x73, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneSemitransparentBrush"]).Color = Color.FromArgb(0xAA, 0x00, 0x00, 0x00);
    ((SolidColorBrush)Resources["PhoneChromeBrush"]).Color = Color.FromArgb(0xFF, 0x1F, 0x1F, 0x1F);

    ((SolidColorBrush)Resources["PhoneInactiveBrush"]).Color = Color.FromArgb(0x33, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneInverseInactiveBrush"]).Color = Color.FromArgb(0xFF, 0xCC, 0xCC, 0xCC);
    ((SolidColorBrush)Resources["PhoneInverseBackgroundBrush"]).Color = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
    ((SolidColorBrush)Resources["PhoneBorderBrush"]).Color = Color.FromArgb(0xBF, 0xFF, 0xFF, 0xFF);

然后,在 App 构造函数中,检查是否启用了 Light 主题,如果是,则覆盖主题:

if ((Visibility) Resources["PhoneLightThemeVisibility"] == Visibility.Visible)

    DarkTheme();

【讨论】:

感谢电话 8.1 参考。我需要做 RequestedTheme = ApplicationTheme.Light;但也将 rootFrame 的背景设置为白色。那是因为我的大部分页面都没有设置背景。 这并不是我在 WP8 上将背景颜色变为黑色。文本是白色的,但背景也是白色的。我为PhoneBackgroundBrush 尝试了一些值,包括Colors.BlackColor.FromArgb(0xFE, 0x01, 0x01, 0x01);,但没有运气。【参考方案2】:

我只是想推荐 Jeff Wilcox 的“Windows Phone 主题管理器”nuget 包,作为为浅色和深色主题实现此功能的简单方法。

http://www.nuget.org/packages/PhoneThemeManager/

只需在 App 构造函数中添加一个函数调用:

ThemeManager.ToDarkTheme();

ThemeManager.ToLightTheme();

【讨论】:

运气好得多。你甚至不需要 NuGet 它;它由 a single file (Apache licensed) 组成,您可以将其放入您的项目中。 小心,这在 WinRT 版本(即 8.1+)中不起作用

以上是关于Windows phone 8 即使手机的主题发生变化,如何始终使用一个主题的主要内容,如果未能解决你的问题,请参考以下文章

即使应用程序在后台运行或手机被锁定在 Windows Phone 中,如何让计时器运行

适用于 Windows Phone 8.1 的后台媒体播放器中的无缝循环

Windows phone silverlight one 主题

Windows Phone 8.1中的ContentDialog无法正常关闭,即使它已隐藏

Windows Phone 8 SQL Server CE 转换为日期时间时发生溢出

jQuery 在 Windows Phone 8 手机间隙应用程序中不能很好地渲染角落