【问题标题】:Change Background of WP7 Application if Theme is altered如果更改主题,则更改 WP7 应用程序的背景
【发布时间】:2011-09-08 06:51:14
【问题描述】:

如果用户在后面的代码中将主题从 "Light" 更改为 "Dark" 或反之亦然,我需要更改我的应用程序的背景图像。我希望这些应该在 Page Loded 事件中完成

【问题讨论】:

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


    【解决方案1】:

    @TimDams 向您指出了检测现在设置什么主题的好方法之一,但我没有注意到有任何信息如何检测期间主题的更改应用程序运行时。用户可以启动您的应用程序,然后将forward 转到菜单,更改主题,然后返回 到您的应用程序。虽然您可能认为您的应用程序将被删除,然后重新启动并重新导航到您的页面,并在所有页面加载的完整周期内 - 这不是 100% 正确的。

    首先,PageLoaded 不是执行 initial 检查和设置样式的好地方,因为如果您调用了该事件,那么页面可能已经渲染过一次.如果我没记错的话,PageLoaded 是在第一次渲染之后调用的。如果这是真的,那么您将不得不更早地检测颜色,例如在 LayoutUpdated 中(警告:这个事件是一个很大的垃圾邮件发送者。我的意思是,它被称为无数次。附加一个单次处理程序,你知道的,比如这将在第一次调用时立即 unattach-self )。也许您可以在页面的 .ctor 中完成,就在 InitializeComponent 之后。或者在 OnApplyTemplate 或 MeasureOverride 中,或至少在 ArrangeOverride 中——视觉效果应该大部分/完全可用。

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

    无论如何,如果您的应用“暂停”并且用户在此期间切换主题,我认为(我尚未检查)您的页面将(在大多数情况下)只是暂时隐藏,返回屏幕后,可能不会重新创建,也不会重新(页面)加载。如果这是真的,那么您将没有那么容易解决的问题,因为您的应用程序可能会暂停,操作系统会重新设置主题,并且您的应用程序在任何时候几乎都不会暂停,而您在此期间唯一会遇到的事件是 . ... App.Deactivated 和 App.Activated 的全局事件。有可能完全不会触发任何每页事件 [但我没有检查过 - 在您执行我在下面建议的任何操作之前,请检查一下]。

    如果这种悲观观点是真的,那么在那些事件中,您将不得不检测当前主题(->Tim 的帖子),然后以某种方式通知您当前的主页主题已更改 - 或没有.如果您的 ViewModel 至少与应用程序的其余部分分开(应该是这样:)),您有一个简单的选择:在该 ViewModel 中创建一组属性(dp 或 inotif),如画笔背景,画笔前景、画笔高光和其他您需要的,而不是在 XAML 中对颜色进行编码 - 绑定到这些属性。您可能想要为所有这些画笔和其他样式创建一个单独的类,让我们说“pub class MyCurrentAppTheme”并将该道具保留在那里,并从 ViewModel 公开此类对象 - 无论如何。只需将您的颜色绑定到任何东西——但任何东西都是“逻辑上全局的”,并且可以从 App.Accticated 事件处理程序轻松访问。完成后,在 App.Activated 中检测当前主题,如果更改,则通过 VM 中保存的所有颜色并适当地设置它们。瞧,您的整个应用程序都会正确重新着色。

    但请注意,在渲染缓存的旧主题、刷新数据绑定对象和重绘新主题之间可能会有一些短暂的闪烁。我希望不会,但我感觉它可能会发生,尤其是从快速切换工具(长按)返回时:我认为设备会在后台缓冲区中捕获应用程序的“最后一个屏幕截图”,并一直使用它应用程序被“最小化”以进行过渡动画,显示快速应用程序切换概述等等..再次,我没有检查过,但我怀疑在这样的动画期间页面内容是“实时”的,它可能非常对 CPU/GPU 资源的要求很高。有人知道吗?在页面上有一些循环动画,然后切换并检查快速切换概述,动画是移动还是停止,这可能是一个很好的测试!:)

    【讨论】:

      【解决方案2】:

      如果您的应用程序被墓碑化,您的所有控件都将重新创建并应用新主题。如果您想以与正常主题类似的方式管理您的浅色/深色特定样式,您可能想要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

      My ResourceDictionary 对于初始启动仍然有用,但不幸的是,似乎无法解决 Mango 错误。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          您能否对 App.Activate - Deactivate 进行一些测试?

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

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

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

          希望这会有所帮助。

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 2021-08-28
              • 1970-01-01
              • 2011-03-08
              • 1970-01-01
              • 1970-01-01
              • 2011-06-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多