WP7项目中的主题感知XAML资源

时间:2011-01-09 15:06:33

标签: xaml windows-phone-7

我正在制作一个Windows Phone 7应用程序,我对暗/亮主题感到困惑。

使用全景图时,您经常会设置背景图像。问题在于制作适合黑暗和光明主题的照片非常困难。我们该怎么办?

有没有办法强制拍摄全景的暗/亮主题?这将避免制作特定主题的全景背景图片。那怎么办?我在C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.0\Design中找到了xaml文件。如果这是一种正确的方法,我该如何将其导入我的全景图?

或者如果没有办法(或者是否错误)强制暗/亮主题:如何编写条件XAML来设置正确的资源?现在我有以下XAML(default.xaml),黑暗主题很好:

<ImageBrush x:Key="PageBackground" ImageSource="Resources/PageBackground.png" Stretch="None" />
<ImageBrush x:Key="PanoramaBackground" ImageSource="Resources/PanoramaBackground.png" Stretch="None" />

但是当我使用浅色主题时,黑色背景图片难以阅读黑色控件和黑色文本。所以我制作了不同的照片,我可以用这种方式:

<ImageBrush x:Key="PageBackground" ImageSource="Resources/PageBackgroundLight.png" Stretch="None" />
<ImageBrush x:Key="PanoramaBackground" ImageSource="Resources/PanoramaBackgroundLight.png" Stretch="None" />

现在我的问题是让XAML有条件地根据当前主题声明正确的东西。

我在互联网上找不到相关的方法。我宁愿不使用代码或代码隐藏,因为我相信XAML能够做到这一点(我只是不知道如何)。

编辑:将xaml文件加载为ResourceDictionary的代码段

string xaml = null;
StreamResourceInfo xamlInfo = Application.GetResourceStream(new Uri("light.xaml", UriKind.Relative));
using (StreamReader sr = new StreamReader(xamlInfo.Stream))
    xaml = sr.ReadToEnd();
dic = (ResourceDictionary)XamlReader.Load(xaml);
this.Resources.MergedDictionaries.Add(dic);

2 个答案:

答案 0 :(得分:5)

要强制使用深色或白色主题,您确实可以使用您指出的文件夹中定义的样式。复制并粘贴App.xaml所需的规则(只需PhoneForegroundColor,PhoneBackgroundColor和相关的Brushes就是一个好的开始)。

尽管保持“主题感知”并为明暗主题加载不同的图像可能会更好。这篇文章解释了如何执行此操作:http://blog.jayway.com/2010/12/16/theme-aware-panorama-background-in-windows-phone-7/

答案 1 :(得分:0)

我发现了另一种可能性:您可以根据Coding4Fun Toolkit使用these instructions转换器。但是,我无法正确使用它们。

另一种可能性是使用OpacityMask。但这仅适用于黑/白图像:/

Yousef的解决方案看起来很有趣。 但加载时间太长。应用程序启动后,图像将在大约1秒后更改。我已经在诺基亚820上测试了这个。我已经调用了在一个Loaded Event中设置DataContext的调用,这个调用稍后会被调用。现在调用发生在构造函数中,因此当应用程序显示它时,图像将被设置。但是,它仍然会增加更多的加载时间:(有关如何改进的任何建议吗?