1

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

细节...

在 Windows Phone 7 项目中,我需要根据用户的主题(浅色/深色)替换应用程序资源。简而言之,思路很明显:
    a) 创建 ResourceDictionary 变量
    b) 根据当前主题获取相应的样式和画笔资源文件
    c) 将上述资源添加到 Application.Current.Resources.MergedDictionaries

这就是我正在做的事情:

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

2) 2 个 Brushes.xaml 文件中的样式具有相同的 Keys。与 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 填充到应用程序的 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)为了让brushesStreamReader不在null上面的代码中,我必须将xaml文件设置为“内容”。(为什么?)

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>

是吗?
谢谢!

4

2 回答 2

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;
     }
}
于 2013-01-18T16:10:41.623 回答
-1

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

于 2012-11-30T05:41:53.343 回答