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

5

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

我能找到的每个示例都说,您可以通过复制ThemeResources.xamlSystem.Windows.xaml文件,并将它们包含为合并字典在您的应用程序中来创建自定义主题。

http://windowsphonegeek.com/articles/Creating-WP7-Custom-Theme-ndash-Basic-Theme-Implementation 在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个回答

4
在当前版本的WP7中,不可能有一个新的样式来改变默认样式而不是通过“x:Key”显式设置它:
隐式样式是Silverlight 4(和WPF)的一个功能:Windows Phone 7基于Silverlight 3+(添加了一些Silverlight 4功能)。由于Silverlight 3中没有隐式样式,这意味着在Windows Phone 7中也无法使用它们。
现在你可以:
1. 只能像第一篇文章中解释的那样覆盖默认的Brushes/Colors资源。请注意,所有WP7控件都将更改其颜色。还要注意的是,由于当前版本的WP7存在问题,因此默认背景仍保持不变。这是一个已知问题,可能会在“Mango”更新中得到修复。 2. 如果您想要任何新的Style/ControlTemplate,则必须使用“x:Key”/{StaticResource ...}方法,如您指出的第二篇文章中所述。
最后,正如Derek Lakin之前提到的那样:希望这个bug会在Mango更新中得到修复!

我有一个样式/主题,我想始终应用,无论是浅色还是深色主题。最好的方法是只需通过复制的 ThemeResources.xaml 文件并更改所有内容,然后显式地设置未设置的事物(例如背景)吗?或者使用合并的主题会有很多不会被隐式设置的东西吗? - Josh Close

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>

理论上来说,这应该足够了,但不幸的是并不是这样。由于某种原因(希望在Mango更新中修复的错误),您还需要像这样在Custom.xaml中包含Reset.xaml:
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Reset.xaml"/>
    </ResourceDictionary.MergedDictionaries>

一旦您完成了这个,那就应该是这样了;您不需要再做任何事情。

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

示例:

            (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中,我们将不再需要进行这种解决方法。

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