如果用户更改主题,我需要更改应用程序的背景图像"Light" to "Dark"或在代码隐藏中反之亦然。我希望这些应该在页面已加载 event
@TimDams 向您指出了检测现在设置的主题的好方法之一,但我没有注意到有任何信息如何检测a change在应用程序运行时主题。用户可以启动您的应用程序,然后启动forward到菜单,更改主题,然后获取back到您的应用程序。虽然您可能认为您的应用程序将被逻辑删除,然后重新启动并重新导航到您的页面,并在所有页面加载的情况下进行完整的循环 - 但这并不是 100% 正确。
首先,PageLoaded 不是执行以下操作的好地方initialcheck-and-set-styles,因为,如果您调用该事件,则该页面可能已经呈现一次。如果我没记错的话,PageLoaded 是在第一次渲染后立即调用的。如果这是真的,那么您将必须更早地检测颜色,例如在 LayoutUpdated 中(警告:此事件是一个很棒的垃圾邮件发送者。我的意思是,它被调用了无数次。附加一个单次处理程序,您知道,这样第一次调用时会立即取消附加)。也许您可以在页面的 .ctor 中(就在 InitializeComponent 之后)执行此操作。或者在 OnApplyTemplate 或 MeasureOverride 中,或者至少在 ArrangeOverride 中——视觉效果应该在那里大部分/完全可用。
不过。我故意将“初始”一词“加粗”。在 Mango 中,多任务处理变得越来越普遍,但即使是 Mango 7.0 之前的版本也不能保证您的应用程序将被逻辑删除。例如,根据我在 7.0 早期的观察,从 WebBrowser 组件启动 MediaPlayer 不会对您的应用程序进行逻辑删除:) 如果您有时间阅读,请检查WP7从Tombstone恢复并返回页面有关“暂停”与“墓碑”的详细信息。
无论如何,如果您的应用程序“暂停”并且用户同时切换主题,我think(我没有检查)您的页面(在大多数情况下)将只是暂时隐藏,并且在返回到屏幕时,它可能不会被重新创建,也不会被重新(页面)加载。如果这是真的,那么您将没有那么容易解决的问题,因为您的应用程序可能会暂停,操作系统可能会重新主题,并且您的应用程序实际上会在任何时刻取消,而您同时收到的唯一事件是 。 ... App.Deactivated 和 App.Activated 的全局事件。有可能完全不会触发任何每页事件[但我没有检查过 - 在执行我下面建议的任何操作之前,请检查一下]。
If这种悲观的观点确实是正确的,在这些事件中,您将必须检测当前主题(->蒂姆的帖子),然后以某种方式通知您当前的页面主题是否已更改。如果您的 ViewModel 至少与应用程序的其余部分分开(应该如此:)),您有一个简单的选择:在该 ViewModel 中创建一组属性(dp 或 inotif),例如 Brush Background,画笔前景、画笔高光和其他您需要的内容,而不是在 XAML 中对颜色进行编码 - 绑定到这些属性。您可能想要为所有这些画笔和其他样式创建一个单独的类,比方说“pub class MyCurrentAppTheme”并将该道具保留在那里,并从 ViewModel 公开此类对象 - 无论如何。只需将您的颜色绑定到任何内容 - 但无论什么内容都是“逻辑上全局的”,并且可以从 App.Accticated 事件处理程序轻松访问。完成此操作后,在 App.Activated 中,检测当前主题以及是否已更改,因此检查 VM 中保存的所有颜色并适当设置它们。瞧,您的整个应用程序已正确重新着色。
但请注意,在渲染缓存的旧主题、刷新数据绑定对象和重新绘制新主题之间可能会出现一些短暂的闪烁和闪烁。我希望不会,但我感觉它可能会发生,特别是从快速切换工具(长按后按)返回时:我认为设备会在后台缓冲区中捕获应用程序的“最后一个屏幕截图”,并始终使用它应用程序被“最小化”以执行转换动画,显示快速应用程序切换概述等等。再次,我没有检查过,但我怀疑在这样的动画期间,页面内容是“实时”的,它可能非常对CPU/GPU资源要求很高。有人知道这方面的情况吗?在页面上放置一些循环动画,然后切换并检查快速切换概述,看看动画是否移动或停止,这可能是一个很好的测试!:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)