Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows phone 7 如果主题被更改,则更改WP7应用程序的背景_Windows Phone 7_C# 4.0_Silverlight 4.0 - Fatal编程技术网

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

Windows phone 7 如果主题被更改,则更改WP7应用程序的背景,windows-phone-7,c#-4.0,silverlight-4.0,Windows Phone 7,C# 4.0,Silverlight 4.0,如果用户将主题从“浅”更改为“暗”,或者将代码隐藏中的vesa更改为“浅”,我需要更改应用程序的背景图像。我希望这些应该在页面loed事件中完成,因为此事件不存在。您需要通过比较PhoneBackgroundBrush的颜色来手动找出这一点,以查看用户是否具有暗主题或浅主题,并将其与上次存储的值进行比较。@TimDams为您指出了一种检测现在设置的主题的好方法,但是我没有注意到有任何关于如何在应用程序运行时检测主题变化的信息。用户可以启动你的应用程序,然后将向前推到菜单,更改主题,然后返回到你的

如果用户将主题从“浅”更改为“暗”,或者将代码隐藏中的vesa更改为“浅”,我需要更改应用程序的背景图像。我希望这些应该在页面loed事件中完成,因为此事件不存在。您需要通过比较PhoneBackgroundBrush的颜色来手动找出这一点,以查看用户是否具有暗主题或浅主题,并将其与上次存储的值进行比较。

@TimDams为您指出了一种检测现在设置的主题的好方法,但是我没有注意到有任何关于如何在应用程序运行时检测主题变化的信息。用户可以启动你的应用程序,然后将向前推到菜单,更改主题,然后返回到你的应用程序。虽然你可能会认为你的应用程序会被删除,然后重新启动,并以整个页面加载周期重新激活到你的页面,但这并不是100%正确的

首先,PageLoaded不是执行初始检查和设置样式的好地方,因为如果调用了该事件,那么页面可能已经呈现过一次。如果我记得很清楚的话,PageLoaded是在第一次渲染之后调用的。如果这是真的,那么您必须更早地检测颜色,例如在LayoutUpdated中(警告:此事件是一个伟大的垃圾邮件发送者。我的意思是,它被称为无数次。您知道,附加一个单发处理程序,以便在第一次调用时立即取消连接self)。也许您可以在初始化Component之后在页面的.ctor中执行此操作。或者在OnApplyTemplate或MeasureOverride中,或者至少在ArrangeOverride中,视觉效果应该大部分/完全可用

布乌特。我故意“加粗”了“首字母”。有了芒果,多任务处理变得越来越普遍,但即使是芒果7.0之前的版本也不能保证你的应用程序会被删除。例如,根据我在7.0早期的观察,从WebBrowser组件启动MediaPlayer不会删除你的应用:)如果你有时间阅读,请查看“暂停”与“删除”的详细信息

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

如果这种悲观观点真的是真的,那么在这些事件中,你必须检测当前主题(->Tim的帖子),然后以某种方式通知当前页面主题是否发生了变化。如果您的ViewModel与应用程序的其余部分至少有一点不同(应该是:),那么您可以使用一个简单的选项:在该ViewModel中创建一组属性(dp或inotif),如笔刷背景、笔刷前景、笔刷高光,以及您需要的其他属性,与在XAML中编码颜色不同,绑定到这些属性。您可能希望为所有这些画笔和其他样式创建一个单独的类,比如说“pub class MyCurrentAppTheme”,并将该道具保留在那里,然后从ViewModel中公开这样的对象—不管是什么。只需将您的颜色绑定到任何内容,但任何内容都将是“逻辑全局”的,并且可以从App.Acticated事件处理程序轻松访问。完成后,在App.Activated中,检测当前主题,如果更改,则通过VM中保留的所有颜色进行适当设置。瞧,你的整个应用程序都被重新调用了


但请记住,在呈现缓存的旧主题、刷新数据绑定对象和重新绘制新主题之间,可能会有一些短暂的闪烁。我希望不会,但我感觉可能会发生这种情况,特别是当从快速切换工具(长时间后按)返回时:我认为该设备会在backbuffer中捕获应用程序的“最后一个屏幕截图”,并在应用程序“最小化”的所有时间内使用该截图来执行过渡动画、显示快速应用程序切换概述等等。。同样,我没有检查,但我怀疑在这样的动画中,页面内容是“活的”,这可能对CPU/GPU资源要求很高。有人知道这件事吗?这可能是一个很好的测试,在页面上有一些循环动画,然后切换出并检入快速切换概述,无论动画是移动还是停止!:)

如果应用程序被删除,所有控件都将被重新创建,新主题也将被应用。如果你想以一种与普通主题类似的方式管理你的明暗风格,你可能需要我写一段时间以前的博客

不幸的是,在Mango那里,有一个bug(?)与快速应用程序切换有关,导致应用程序中的主题保持不变。此问题及其链接帖子中概述了该漏洞:


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

您是否能够对应用程序进行一些测试。激活-停用

我决定用一种不同的方式来解决动态主题变化的问题

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

对于系统菜单栏中的按钮,没有问题,因为它们始终位于黑色gra上
public static bool CurrentThemeIsDark
{
  get
    {
      return (Visibility)Application.Current.Resources["PhoneDarkThemeVisibility"] == Visibility.Visible;
    }
}