@ 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.Кто-нибудь знает что-нибудь об этом?Это может быть хорошим тестом, чтобы иметь некоторую циклическую анимацию на странице, а затем переключиться и проверить в обзоре быстрого переключения, движется ли анимация или остановлена! :))