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

3

我正在制作一个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个回答

5
要强制使用深色或白色主题,您确实可以使用在您指定的文件夹中定义的样式。将您需要的规则复制并粘贴到App.xaml中(仅PhoneForegroundColor、PhoneBackgroundColor和相关的Brushes即可作为一个好的开始)。
不过,最好还是保持“主题感知”,为浅色和深色主题加载不同的图像。这里有一篇文章解释如何做到这一点:http://blog.jayway.com/2010/12/16/theme-aware-panorama-background-in-windows-phone-7/

非常相关的答案和文章。然而,我认为处理这个视图问题不是ViewModel的责任。如果找不到XAML的方法,这是一个很好的解决办法。 - SandRock
我认为没有纯粹的XAML方式(没有条件XAML这种东西)。其他选项是编写自定义ValueConverter来选择正确的背景或ContentControl,根据主题选择两个DataTemplates中的一个。 - Yousef
1
好的。接下来,我创建了一个light.xaml文件(构建操作:内容,复制:不复制)。该文件包含我想要覆盖的资源,如果用户使用浅色主题。在App.xaml.cs中,在InitializePhoneApplication();之后,如果浅色主题测试通过,则动态加载light.xaml。这不是完整的XAML方式,但只涉及5行代码。 - SandRock
1
仅作为对此答案的补充:即使将主题复制/粘贴到您的App.xaml代码中,您仍然必须显式地将资源绑定到页面的根元素,才能加载正确的资源。 - johnhforrest
+1 感谢,关于主题感知背景图片的示例正是我正在寻找的! - Philip Daubmeier

0

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

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

Yousef的解决方案看起来很有趣。 但加载时间太长了。应用程序启动后大约1秒钟才会更改图像。我在Nokia 820上进行了测试。 我将设置DataContext的调用移动到Loaded事件中,该事件稍后被调用。现在,在构造函数中进行调用,因此当应用程序显示它时,图像已经设置好了。但是,它仍然增加了更多的加载时间 :( 有没有关于如何改进这个问题的建议?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接