2013-07-11 6 views
8

Moja aplikacja jest zazwyczaj przeznaczone dla dark tematu, i używam StaticResources Więc jeśli użytkownik zmieni temat jego telefon do light aplikacja staje się nieczytelny i bezużyteczny.Windows Phone 8 Jak być zawsze na jeden temat, nawet jeśli motyw telefonu zmieniło

Próbowałem ręcznie zmienić kolor każdego elementu i unikać StaticResources i takie rzeczy jak:

Style="{StaticResource PhoneTextLargeStyle}" 

i StaticResources dla czcionki i koloru. Ale to ciężka praca.

Jak mogę globalnie zmienić temat w mojej aplikacji, sądząc, że motyw telefonu jest ciemny? (jest to Windows Phone 8 app)

Odpowiedz

20

Aktualizacja: Od wydania Windows Phone 8.1, można ustawić RequestedTheme atrybut na jakiejkolwiek kontroli, lub nawet na poziomie aplikacji do ręcznym Temat ustawiony przez użytkowników w Ustawieniach.

Przykład zmusić światła motyw:

W kodzie, w konstruktorze klasy aplikacji:

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

Albo w 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> 

Dla starego modelu aplikacji: Windows Phone 8:

Jest oczywiście zalecane w wytycznych projektowania, aby użyć zasobów kompozycji, aby upewnić się, że aplikacja działa z dowolnym kolorem motywu i akcentu.

Jednakże, jeśli naprawdę chcesz, aby wymusić ciemny motyw, o to rozwiązanie dostarczone przez Rudy Huyn na swoim blogu: http://www.rudyhuyn.com/blog/2013/01/18/forcer-un-theme-sous-windows-phone-8/

Chodzi o to, aby dodać metodę w swojej klasie aplikacji, która zastąpi wszystkie szczotki systemowych z kolorami ciemnego motywu:

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

Następnie w konstruktorze aplikacji, należy sprawdzić, czy światło jest włączone tematem, a jeżeli tak, to zastąpić motywu:

if ((Visibility) Resources["PhoneLightThemeVisibility"] == Visibility.Visible) 
{ 
    DarkTheme(); 
} 
+0

dzięki za telefon 8.1 odniesienia. Musiałem zrobić RequestedTheme = ApplicationTheme.Light; Ale także ustaw tło rootFrame na białe. To dlatego, że większość moich stron nie ma ustawionego tła. – Quincy

+1

To nie zmienia koloru tła na czarny w WP8. Tekst jest biały, ale tło pozostaje również białe. Próbowałem kilka wartości dla 'PhoneBackgroundBrush', w tym' Colors.Black' i 'Color.FromArgb (0xFE, 0x01, 0x01, 0x01);', ale bez powodzenia. – ruffin

12

Po prostu chciałem polecić pakiet nuget Jeffa Wilcoxa "Menedżer motywów Windows Phone" jako łatwy sposób na wdrożenie tej funkcjonalności dla jasnych i ciemnych motywów.

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

Wystarczy dodać wywołanie funkcji konstruktora App:

ThemeManager.ToDarkTheme(); 

lub

ThemeManager.ToLightTheme(); 
+1

Dużo więcej szczęścia z tym. Nie musisz tego nawet robić; składa się z [jednego pliku (licencjonowanego przez Apache)] (https://github.com/jeffwilcox/wp-thememanager/blob/master/src/JeffWilcox.PhoneThemeManager/ThemeManager.cs), który można wrzucić do projektu. – ruffin

+0

ostrożnie, to nie działa w wersjach WinRT (tj. 8.1+) – ericosg

Powiązane problemy