Windows Phone(7.1)根据用户当前主题“换肤”

时间:2012-11-30 04:35:32

标签: windows-phone-7 xaml themes windows-phone skinning

简而言之,我的问题是:如何在WP7.1应用程序中切换ResourceDictionaries?有没有比我想做的更简单的方法?

详细...

在Windows Phone 7项目中,我需要根据用户的主题(亮/暗)替换应用程序资源。简而言之,这个想法很明显:
    a)创建一个ResourceDictionary变量
    b)根据当前主题获取适当的样式和刷子资源文件     c)将上述资源添加到Application.Current.Resources.MergedDictionaries

这就是我在做的事情:

1)“查看”项目中资源的文件夹结构:
资源
黑暗
Brushes.xaml
Styles.xaml

Brushes.xaml
Styles.xaml

2)2个Brushes.xaml文件中的样式具有相同的键。与Styles.xaml相同。

3)在我的第一次尝试中(假设选择了轻量级主题)我在第二行得到“未指明的错误”。

var uriPath = "Resources/Light/Brushes.xaml"; 
var brushes = new ResourceDictionary {Source = new Uri(uriPath, UriKind.Relative)};
dic.MergedDictionaries.Add(brushes);

(仅供参考我尝试使用资源,页面和内容构建操作)

4)我的第二次尝试给了我希望,因为我成功地将Brushes.xaml填充到App的MergedDictionaries中:

string xaml;
var uriPath = "Resources/Light/Brushes.xaml";
var brushesUri = new Uri(uriPath, UriKind.Relative);
var brushesStream = Application.GetResourceStream(brushesUri);
using (var brushesStreamReader = new StreamReader(brushesStream.Stream))
    xaml = brushesStreamReader.ReadToEnd();
var dic = new ResourceDictionary();
dic.MergedDictionaries.Add((ResourceDictionary)XamlReader.Load(xaml));

5)为了使brushStreamReader在上面的代码中不是null,我必须将xaml文件设置为“Content”。 (为什么?)

6)第4步中我的代码的第二个问题是尝试使用Styles.xaml做同样的事情。我在最后一行得到了一个“Failed to assign to property 'System.Windows.ResourceDictionary.Source'”(dic.MergedDictionaries.Add ...)。也许这是因为Styles.xaml将Brushes.xaml添加到它自己的MergedDictionaries:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Brushes.xaml"/>
</ResourceDictionary.MergedDictionaries>
是吗?
谢谢!

2 个答案:

答案 0 :(得分:0)

在这种情况下,您可以抓住主题画笔并进行分析。例如:

private Color lightThemeBackground = Color.FromArgb(255, 255, 255, 255); 
private Color darkThemeBackground = Color.FromArgb(255, 0, 0, 0);  


public bool IsLightTheme()
{
     SolidColorBrush backgroundBrush = Application.Current.Resources["PhoneBackgroundBrush"] as SolidColorBrush;   
     if (backgroundBrush.Color == lightThemeBackground) { 
          // you are in the light theme
          return true;
     } 
     else { 
          // you are in the dark theme
          return false;
     }
}

答案 1 :(得分:-1)

你不应该这样做。只需使用系统画笔即可获得所有主题颜色。 以下是这些画笔的概述:http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff769552.aspx#BKMK_BrushResources