自定义主题覆盖默认主题WP7

时间:2011-04-14 05:29:20

标签: xaml windows-phone-7 themes

是否可以创建自定义主题并将其用作默认主题?

我可以在任何地方找到的每个示例都说您可以通过复制ThemeResources.xamlSystem.Windows.xaml文件并将其作为合并词典添加到您的应用中来创建自定义主题。

http://windowsphonegeek.com/articles/Creating-WP7-Custom-Theme-ndash-Basic-Theme-Implementation Overriding themes in Windows Phone 7

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Resources/CustomThemeResources.xaml" />
            <ResourceDictionary Source="Resources/CustomThemeStyles.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

然后我又读了一些你需要在样式文件中包含画笔的内容,所以在CustomThemeStyles.xaml我有这个。

http://www.windowsphonegeek.com/articles/Creating-WP7-Custom-Theme---Complex-Theme

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="CustomThemeResources.xaml" />
</ResourceDictionary.MergedDictionaries>

它不起作用...所以我下载了示例应用程序,果然,每个想要改变颜色的页面,比如背景颜色,都会将它设置在它最外面的组件上。

<Grid Background="{StaticResource PhoneBackgroundBrush}">
...
</Grid>

是否可以包含更改所有默认值的样式/画笔/颜色/等的自定义主题,而无需在任何地方明确设置它们?

3 个答案:

答案 0 :(得分:4)

在当前版本的WP7中,如果没有通过“x:Key”显式设置更改默认的样式,则无法使用新样式:

隐式样式是Silverlight 4(和WPF)的一项功能:Windows Phone 7基于Silverlight 3+(添加了一些Silverlight 4功能)。由于Silverlight 3中没有隐式样式,这意味着在Windows Phone 7中也无法使用它们。

现在你可以:

  1. 仅覆盖默认的画笔/颜色资源,如您指出的第一篇文章中所述。请注意,所有WP7控件都将更改其颜色。另请注意,由于某种原因,默认背景保持不变。这是当前版本的WP7的一个已知问题,可能会在“芒果”更新中修复。

  2. 如果您想要任何新的Style / ControlTemplate,您必须使用您指出的第二篇文章中提到的“x:Key”/ {StaticResource ...}方法。

  3. 最后,正如前面提到的 Derek Lakin :希望这个错误会在芒果更新中修复!

答案 1 :(得分:1)

如果您创建资源字典并将其称为包含所有标准画笔资源的Reset.xaml。将任何自定义资源样式/画笔放入另一个资源字典中(我们现在将其称为Custom.xaml)。在App.xaml中包含这两个资源字典,如下所示:

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources/Reset.xaml"/>
                <ResourceDictionary Source="Resources/Custom.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary> 
    </Application.Resources>

从理论上讲,这应该足够了,但不幸的是,事实并非如此。出于某种原因(希望在芒果更新中修复的错误),您还需要在Custom.xaml中包含Reset.xaml,如下所示:

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Reset.xaml"/>
    </ResourceDictionary.MergedDictionaries>

一旦你完成了这个,那应该是它;你不应该做任何其他事情。

答案 2 :(得分:1)

随着Windows Phone Mango(7.1)的发布,合并XAML字典样式的功能不再有效。目前,您将不得不在代码隐藏中更改应用程序资源刷机颜色条目;最好是在App.xaml.cs中的App()的构造函数中。

示例:

            (App.Current.Resources["PhoneAccentBrush"] as SolidColorBrush).Color = Color.FromArgb(12, 12, 54, 145);
            (App.Current.Resources["PhoneForegroundBrush"] as SolidColorBrush).Color = Colors.Green;
            (App.Current.Resources["PhoneBackgroundBrush"] as SolidColorBrush).Color = Colors.Purple;

希望在WP8 SDK中我们不再需要这样做。