Изменить фон приложения WP7, если тема изменена - PullRequest
1 голос
/ 08 сентября 2011

Мне нужно изменить фоновое изображение моего приложения, если пользователь меняет тему с "Светлый" на "Темный" или наоборот в коде позади. Я надеюсь, что это должно быть сделано в Page Loded событие

Ответы [ 5 ]

2 голосов
/ 09 сентября 2011

@ TimDams указал вам на один из хороших способов определить, какая тема сейчас установлена, но я не заметил там никакой информации о том, как обнаружить изменение темы во время время выполнения приложения. Пользователь может запустить ваше приложение, затем отправить вперед в меню, изменить тему и вернуть обратно в ваше приложение. Хотя вы можете подумать, что ваше приложение будет захоронено, а затем перезапущено и перенесено на вашу страницу с полным циклом со всеми загрузками страниц - это не на 100% верно.

Во-первых, PageLoaded НЕ является хорошим местом для выполнения начальных check-and-set-styles, потому что, если вы вызываете это событие, то страница, вероятно, уже визуализировалась один раз. Если я хорошо помню, PageLoaded вызывается сразу после первого рендера. Если это так, то вам придется определять цвета раньше, например, в LayoutUpdated (предупреждение: это событие является отличным спамером. Я имею в виду, его вызывают gazillions раз. Присоедините обработчик одиночного выстрела, вы знаете, такой который мгновенно откроется при первом вызове). Может быть, вы сможете сделать это в .ctor страницы, сразу после InitializeComponent. Или в OnApplyTemplate или MeasureOverride, или, по крайней мере, в ArrangeOverride - визуальные элементы должны быть в основном / полностью доступны там.

Buuuut. Я намеренно «обескуражил» слово «начальный». С Mango есть многозадачность, которая становится все более распространенной, но даже версия до Mango 7.0 не гарантирует, что ваше приложение будет захоронено. Например, по моим наблюдениям в начале 7.0, запуск MediaPlayer из компонента WebBrowser не мешает вашему приложению :) Если у вас есть время на чтение, проверьте WP7 recovery из Tombstone и вернитесь на страницу для получения подробной информации о "пауза" против "надгробная плита".

В любом случае, если ваше приложение «останавливается» и пользователь тем временем переключает темы, я думаю (я НЕ проверял), что ваша страница (в большинстве случаев) будет только временно скрытый и по возвращении на экран, он, вероятно, не будет воссоздан и не будет повторно загружен. Если это так, то вам будет непросто решить проблему, потому что ваше приложение может быть приостановлено, операционная система перезагружена, а ваше приложение практически приостановлено в любой момент времени, и единственные события, которые вы получите в это время. ... глобальные события App. Деактивировано и App. Активировано. Вполне возможно, что ни одно из событий на странице не сработает [но я не проверял - прежде чем делать что-либо, что я предлагаю ниже, ПРОВЕРЬТЕ ЕГО].

Если это пессимистическое представление действительно верно, то в этих событиях вам нужно будет определить текущую тему (-> пост Тима), а затем каким-то образом сообщить текущей странице, что темы изменились - или нет. Если ваша ViewModel хотя бы немного отделена от остальной части приложения (как и должно быть :)), у вас есть простой способ сделать это: создать в этом ViewModel набор свойств (dp или inotif), таких как Brush Background, Brush Foreground, Brush Hightlight и другое, что вам нужно, и вместо того, чтобы харкодировать цвета в вашем XAML - свяжите эти свойства. Возможно, вы захотите создать отдельный класс для всех этих многочисленных кистей и других стилей, скажем, «класс паба MyCurrentAppTheme», сохранить его там и выставить такой объект из ViewModel - что угодно. Просто привяжите свои цвета к чему угодно, но к тому, что будет «логически глобальным», и это будет легко доступно из обработчика событий App.Acticated. После этого в App.Activation определите текущую тему и, если она изменилась, просмотрите все цвета, хранящиеся в ВМ, и установите их соответствующим образом. Вуаля, все ваше приложение перекрашивается должным образом.

Но учтите, что все же - могут быть некоторые кратковременные моргания и вспышки между рендерингом кэшированной старой темы, обновлением объектов с привязкой к данным и перерисовкой новой темы.Я надеюсь, что нет, но я чувствую, что это может произойти, особенно при возврате из инструмента быстрого переключения (долгое нажатие назад): я думаю, что устройство захватывает «последний скриншот» вашего приложения в буферном буфере и использует его на протяжении всего времениприложение «минимизировано» для создания анимации переходов, отображения краткого обзора переключателя приложений и т. д. опять же, я не проверял, но сомневаюсь, что во время такой анимации содержимое страницы «живое», это может быть оченьтребующий ресурсов CPU / GPU.Кто-нибудь знает что-нибудь об этом?Это может быть хорошим тестом, чтобы иметь некоторую циклическую анимацию на странице, а затем переключиться и проверить в обзоре быстрого переключения, движется ли анимация или остановлена! :))

1 голос
/ 09 сентября 2011

Если ваше приложение захоронено, все ваши элементы управления будут воссозданы, и будет применена новая тема. Если вы хотите управлять своими специфическими светлыми / темными стилями аналогично обычным темам, вы можете взглянуть на пользовательский ResourceDictionary .

К сожалению, в Mango есть ошибка (?), Связанная с быстрым переключением приложений, из-за которой тема остается неизменной в вашем приложении. Ошибка указана в этом вопросе и связанных с ним сообщениях:

Есть ли ошибка при смене темы, когда приложение отключено и повторно активировано в Windows Phone Mango

Мой ResourceDictionary по-прежнему полезен для первоначального запуска, но, к сожалению, кажется, что ничего нельзя сделать, чтобы обойти ошибку Mango.

0 голосов
/ 07 апреля 2012

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

public static bool CurrentThemeIsDark
{
  get
    {
      return (Visibility)Application.Current.Resources["PhoneDarkThemeVisibility"] == Visibility.Visible;
    }
}
0 голосов
/ 25 января 2012

Удалось ли вам провести какой-нибудь тест в App.Activate - Deactivate?

Я решил использовать другой путь для решения проблемы динамического изменения темы.

Я назначилдля всего текста и кнопок только системные ресурсы цвета.Для значков внутри кнопок в окне вместо использования PNG-изображений-значков я использовал XAML и назначил ему цвет переднего плана из системного ресурса.

Для кнопок в SystemMenuBar проблем нет, поскольку онивсегда на темно-сером фоне, поэтому черные PNG-изображения работают нормально.

Надеюсь, это поможет.

0 голосов
/ 08 сентября 2011

Для этого события не существует. Вам нужно выяснить это вручную, сравнив цвет PhoneBackgroundBrush, чтобы увидеть, есть ли у пользователя темная или светлая тема, и сравнить его с вашим последним сохраненным значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...