アプリの中で白背景と黒背景を切り替える
#wp7dev_jp
さて、大詰めです。テーマ設定に関係なく、アプリの中で白背景と黒背景を切り替える方法です。
■ 簡易版
画面をタップすると白と黒が入れ替わります。
MainPage.xaml.cs
Boolean bLight = false;
private void LayoutRoot_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
{
bLight = !bLight;
if (bLight)
{
(App.Current.Resources["PhoneForegroundBrush"] as SolidColorBrush).Color = Colors.White;
(App.Current as App).RootFrame.Background = new SolidColorBrush(Colors.Black);
}
else
{
(App.Current.Resources["PhoneForegroundBrush"] as SolidColorBrush).Color = Color.FromArgb(222, 0, 0, 0);
(App.Current as App).RootFrame.Background = new SolidColorBrush(Colors.White);
}
}
しかし、コントロールの背景の一部などは色がなくなってしまう場合があります。それはそれぞれ色が別に設定されているためです。そこで完全版。テーマリソースで定義されている色設定を全てマニュアルで定義します。
■ 完全版
MainPage.xaml.cs
Boolean bLight = false;
private void LayoutRoot_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
{
bLight = !bLight;
if (bLight)
Theme.SetLightTheme();
else
Theme.SetDarkTheme();
}
Theme.cs
public static class Theme
{
public static void SetLightTheme()
{
(App.Current as App).RootFrame.Background = new SolidColorBrush(Colors.White);
(App.Current.Resources["PhoneForegroundBrush"] as SolidColorBrush).Color = Color.FromArgb(222, 0, 0, 0);
(App.Current.Resources["PhoneBackgroundBrush"] as SolidColorBrush).Color = Colors.White;
(App.Current.Resources["PhoneContrastBackgroundBrush"] as SolidColorBrush).Color = Colors.White;
(App.Current.Resources["PhoneContrastBackgroundBrush"] as SolidColorBrush).Color = Color.FromArgb(222, 0, 0, 0);
(App.Current.Resources["PhoneDisabledBrush"] as SolidColorBrush).Color = Color.FromArgb(77, 0, 0, 0);
(App.Current.Resources["PhoneTextCaretBrush"] as SolidColorBrush).Color = Color.FromArgb(222, 0, 0, 0);
(App.Current.Resources["PhoneTextBoxBrush"] as SolidColorBrush).Color = Color.FromArgb(38, 0, 0, 0);
(App.Current.Resources["PhoneTextBoxForegroundBrush"] as SolidColorBrush).Color = Color.FromArgb(222, 0, 0, 0);
(App.Current.Resources["PhoneTextBoxEditBackgroundBrush"] as SolidColorBrush).Color = Colors.Black;
(App.Current.Resources["PhoneTextBoxEditBorderBrush"] as SolidColorBrush).Color = Color.FromArgb(222, 0, 0, 0);
(App.Current.Resources["PhoneTextBoxReadOnlyBrush"] as SolidColorBrush).Color = Color.FromArgb(46, 0, 0, 0);
(App.Current.Resources["PhoneSubtleBrush"] as SolidColorBrush).Color = Color.FromArgb(102, 0, 0, 0);
//(App.Current.Resources["PhoneTextBoxSelectionForegroundBrush"] as SolidColorBrush).Color = Colors.White;
(App.Current.Resources["PhoneRadioCheckBoxBrush"] as SolidColorBrush).Color = Color.FromArgb(38, 0, 0, 0);
(App.Current.Resources["PhoneRadioCheckBoxDisabledBrush"] as SolidColorBrush).Color = Colors.Black;
(App.Current.Resources["PhoneRadioCheckBoxCheckBrush"] as SolidColorBrush).Color = Color.FromArgb(222, 0, 0, 0);
(App.Current.Resources["PhoneRadioCheckBoxCheckDisabledBrush"] as SolidColorBrush).Color = Color.FromArgb(77, 0, 0, 0);
(App.Current.Resources["PhoneRadioCheckBoxPressedBrush"] as SolidColorBrush).Color = Colors.Black;
(App.Current.Resources["PhoneRadioCheckBoxPressedBorderBrush"] as SolidColorBrush).Color = Color.FromArgb(222, 0, 0, 0);
(App.Current.Resources["PhoneSemitransparentBrush"] as SolidColorBrush).Color = Color.FromArgb(170, 255, 255, 255);
(App.Current.Resources["PhoneChromeBrush"] as SolidColorBrush).Color = Color.FromArgb(255, 221, 221, 221);
(App.Current.Resources["PhoneInactiveBrush"] as SolidColorBrush).Color = Color.FromArgb(51, 0, 0, 0);
(App.Current.Resources["PhoneInverseInactiveBrush"] as SolidColorBrush).Color = Color.FromArgb(255, 229, 229, 229);
(App.Current.Resources["PhoneInverseBackgroundBrush"] as SolidColorBrush).Color = Color.FromArgb(255, 221, 221, 221);
(App.Current.Resources["PhoneBorderBrush"] as SolidColorBrush).Color = Color.FromArgb(153, 0, 0, 0);
}
public static void SetDarkTheme()
{
(App.Current as App).RootFrame.Background = new SolidColorBrush(Colors.Black);
(App.Current.Resources["PhoneForegroundBrush"] as SolidColorBrush).Color = Colors.White;
(App.Current.Resources["PhoneBackgroundBrush"] as SolidColorBrush).Color = Colors.Black;
(App.Current.Resources["PhoneContrastBackgroundBrush"] as SolidColorBrush).Color = Colors.Black;
(App.Current.Resources["PhoneContrastBackgroundBrush"] as SolidColorBrush).Color = Colors.White;
(App.Current.Resources["PhoneDisabledBrush"] as SolidColorBrush).Color = Color.FromArgb(102, 255, 255, 255);
(App.Current.Resources["PhoneTextCaretBrush"] as SolidColorBrush).Color = Colors.Black;
(App.Current.Resources["PhoneTextBoxBrush"] as SolidColorBrush).Color = Color.FromArgb(191, 255, 255, 255);
(App.Current.Resources["PhoneTextBoxForegroundBrush"] as SolidColorBrush).Color = Colors.Black;
(App.Current.Resources["PhoneTextBoxEditBackgroundBrush"] as SolidColorBrush).Color = Colors.White;
(App.Current.Resources["PhoneTextBoxEditBorderBrush"] as SolidColorBrush).Color = Colors.White;
(App.Current.Resources["PhoneTextBoxReadOnlyBrush"] as SolidColorBrush).Color = Color.FromArgb(119, 0, 0, 0);
(App.Current.Resources["PhoneSubtleBrush"] as SolidColorBrush).Color = Color.FromArgb(153, 255, 255, 255);
//(App.Current.Resources["PhoneTextBoxSelectionForegroundBrush"] as SolidColorBrush).Color = Colors.White;
(App.Current.Resources["PhoneRadioCheckBoxBrush"] as SolidColorBrush).Color = Color.FromArgb(191, 255, 255, 255);
(App.Current.Resources["PhoneRadioCheckBoxDisabledBrush"] as SolidColorBrush).Color = Color.FromArgb(102, 255, 255, 255);
(App.Current.Resources["PhoneRadioCheckBoxCheckBrush"] as SolidColorBrush).Color = Colors.Black;
(App.Current.Resources["PhoneRadioCheckBoxCheckDisabledBrush"] as SolidColorBrush).Color = Color.FromArgb(102, 0, 0, 0);
(App.Current.Resources["PhoneRadioCheckBoxPressedBrush"] as SolidColorBrush).Color = Colors.White;
(App.Current.Resources["PhoneRadioCheckBoxPressedBorderBrush"] as SolidColorBrush).Color = Colors.White;
(App.Current.Resources["PhoneSemitransparentBrush"] as SolidColorBrush).Color = Color.FromArgb(170, 0, 0, 0);
(App.Current.Resources["PhoneChromeBrush"] as SolidColorBrush).Color = Color.FromArgb(255, 31, 31, 31);
(App.Current.Resources["PhoneInactiveBrush"] as SolidColorBrush).Color = Color.FromArgb(51, 255, 255, 255);
(App.Current.Resources["PhoneInverseInactiveBrush"] as SolidColorBrush).Color = Color.FromArgb(255, 204, 204, 204);
(App.Current.Resources["PhoneInverseBackgroundBrush"] as SolidColorBrush).Color = Colors.Black;
(App.Current.Resources["PhoneBorderBrush"] as SolidColorBrush).Color = Color.FromArgb(191, 255, 255, 255);
}
}
1個所コメントアウトしているのは、白背景時も黒背景時も特に設定が変わらないため。
チェックボックスもテイストボックスもスライダーも完璧です。
テーマで白黒切り替えるのは面倒ですが、アプリ内に白・黒切り替える機能があればちょっとうれしいかもしれません。