如果更改主题,则更改WP7应用程序的背景

时间:2011-09-08 06:51:14

标签: windows-phone-7 c#-4.0 silverlight-4.0

我需要更改应用程序的背景图像,如果用户将主题从“Light”更改为“Dark”或后面的代码中的副vesa。我希望这些应该在 Page Loded 事件

中完成

5 个答案:

答案 0 :(得分:2)

@TimDams向您指出了检测what-theme-now-set-set的好方法之一,但我没有注意到有关如何在主题期间检测更改的任何信息应用程序运行时。用户可以启动您的应用,然后将转发添加到菜单,更改主题,然后返回到您的应用。虽然您可能认为您的应用程序将被逻辑删除,然后重新启动并重新导航到您的页面,并且所有页面加载完全循环 - 这不是100%正确。

首先,PageLoaded不是一个做初始检查和设置样式的好地方,因为,如果你调用了那个事件,那么页面可能已经渲染了一次。如果我记得很清楚,就会在第一次渲染之后调用PageLoaded。如果这是真的,那么你必须提前检测颜色,例如在LayoutUpdated中(警告:这个事件是一个伟大的垃圾邮件发送者。我的意思是,它被称为gazillions次。附加一个单一的处理程序,你知道,如此这将在第一次调用时立即取消自我。也许你可以在Page的.ctor中完成它,就在InitializeComponent之后。或者在OnApplyTemplate或MeasureOverride中,或者至少在ArrangeOverride中 - 视觉效果应该在那里大部分/完全可用。

Buuuut。我故意'加粗'“初始”这个词。使用芒果,有一些多任务处理变得越来越普遍,但即使是前芒果7.0版也不能保证你的应用程序会被墓碑化。根据我在7.0早期的观察,例如,从WebBrowser组件启动MediaPlayer不会破坏你的应用程序:)如果你有时间阅读,请查看WP7 recover from Tombstone and return to page以获取有关“暂停”与“墓碑”的详细信息。 / p>

无论如何,如果您的应用被“暂停”并且用户在此期间切换主题,我(我没有检查过)您的网页(在大多数情况下)将是暂时隐藏,返回屏幕后,可能不会重新创建,也不会重新(页面)加载。如果确实如此,那么你就不会有这么容易解决的问题,因为你的应用可能会被暂停,操作系统会被重新调整,并且你的应用程序几乎在任何时候都会被取消,并且你将在同一时间内获得的唯一事件是。 ... App.Deactivated和App.Activated的全局事件。完全没有任何一页的事件会被触发[但我没有检查 - 在你做我在下面建议的任何事情之前,检查它]。

如果这个悲观主义观点确实如此,那么你必须检测当前主题( - > Tim的帖子),然后以某种方式告知你当前的主页更改了主题 - 或者不。如果你的ViewModel至少与应用程序的其余部分分开(应该是:),你有一个简单的选择:在ViewModel中创建一组属性(dp或inotif),如Brush Background,刷前景,刷高光以及其他所需的,而不是在XAML中对颜色进行编码 - 绑定到这些属性。你可能想要为所有那些Brushes和其他样式创建一个单独的类,让我们说“pub class MyCurrentAppTheme”并保留那些道具,并从ViewModel公开这样的对象 - 无论如何。只需将你的颜色绑定到任何东西 - 但无论是什么“逻辑全局”,并且可以从App.Acticated事件处理程序轻松访问。完成后,在App.Activated中,检测当前主题并且如果已更改,则通过VM中保留的所有颜色并适当地设置它们。 Voil'a,整个你的应用程序得到了适当的反复使用。

但请注意,在缓存的旧主题渲染,刷新数据绑定对象和重新绘制新主题之间可能会有一些瞬间闪烁和闪烁。我希望不会,但我觉得它可能会发生,特别是从快速切换工具返回时(长按):我认为该设备在后备缓冲区中捕获应用程序的“最后一个屏幕截图”,并始终使用它应用程序是'最小化'来做转换动画,显示快速应用程序切换概述等等..再次,我没有检查,但我怀疑在这样的动画期间页面内容是'活的',它可能是非常的对CPU / GPU资源的破坏。任何人都知道这件事吗?在页面上有一些循环动画然后切换并检查快速切换概述,无论动画是移动还是停止,这都是一个不错的测试!:)

答案 1 :(得分:1)

如果您的应用程序已被逻辑删除,则将重新创建所有控件并应用新主题。如果您希望以与普通主题类似的方式管理您的明/暗特定样式,您可能希望take a look at a custom ResourceDictionary我在一段时间后发表了博客。

不幸的是,就像Mango那样,是一个与快速应用程序切换相关的错误(?)导致主题在您的应用程序中保持不变。该问题及其相关帖子中概述了该错误:

  

Is there a bug when changing themes when app is deactivated and reactivated in Windows Phone Mango

我的ResourceDictionary对于初始启动仍然有用,但不幸的是,似乎没有办法解决芒果错误。

答案 2 :(得分:0)

为此,不存在任何事件。您需要通过比较PhoneBackgroundBrush颜色手动计算出来,以查看用户是否具有暗主题或浅主题,并将其与您上次存储的值进行比较。

答案 3 :(得分:0)

您是否可以在App.Activate上进行一些测试 - 停用?

我决定使用不同的路径来解决动态主题变化的问题。

我已经为所有文本和按钮分配了系统资源颜色。 对于窗口中按钮内的图标,而不是使用PNG图像 - 我在XAML中使用的图标,并从系统资源中为它提供前景颜色。

对于SystemMenuBar中的按钮没有问题,因为它们总是在深灰色背景上,因此黑色PNG图像可以正常工作。

希望这有帮助。

答案 4 :(得分:0)

您可以通过这个简单的检查来检查暗主题是否正在使用:

public static bool CurrentThemeIsDark
{
  get
    {
      return (Visibility)Application.Current.Resources["PhoneDarkThemeVisibility"] == Visibility.Visible;
    }
}