Определение текущей темы в Windows Phone 7

Windows Phone 7 позволяет пользователю установить одну из тем – светлую или темную, а также задать цвет акцента. По задумке разработчиков WP7 в зависимости от этого выбора переопределяются и ресурсы приложения, а следовательно и приложение изменяет свой внешний вид. Из-за этого создаются ситуации, когда приложению необходимо определить какая тема на данный момент активна и в зависимости от этого, изменить логику. В этой заметке я покажу как можно определить текущую тему простым способом.

Определить текущую тему в Windows Phone 7 очень просто. Для этого достаточно обратиться к ресурсам — ОС сама устанавливает значения соответствующих ключей в зависимости от установки текущей темы. В нашем случае интересны два ключа в ресурсах – PhoneDarkThemeVisibility и PhoneLightThemeVisibility. Каждый из этих ключей содержит объекты типа Visibility, которые устанавливаются в значение Visible или Collapsed в зависимости от того, какая тема сейчас установлена. Например, проверить установку темной темы можно следующим образом:

Visibility themeVisibility = (Visibility)Resources["PhoneDarkThemeVisibility"];
if (themeVisibility == Visibility.Visible)
{
  // Dark theme
}

Такой способ не очень удобен для использования в различных частях приложения. Поэтому я создал небольшой класс, содержащий методы расширения объекта Application:

public static class ThemeExtensions
{
  public static bool IsDarkTheme(this Application app)
  {
    Visibility themeVisibility = (Visibility)app.Resources["PhoneDarkThemeVisibility"];
    return themeVisibility == Visibility.Visible;
  }

  public static bool IsLightTheme(this Application app)
  {
    Visibility themeVisibility = (Visibility) app.Resources["PhoneLightThemeVisibility"];
    return themeVisibility == Visibility.Visible;
  }
}

Теперь для определения текущей темы можно использовать следующий код:

bool isDark = App.Current.IsDarkTheme();
bool isLight = App.Current.IsLightTheme();