为每个项目类型分隔ResourceDictionary

时间:2014-05-03 13:23:29

标签: resourcedictionary windows-phone-8.1 win-universal-app

我在我的共享项目中创建了一个ResourceDictionary而没有任何问题。但是,我的一些样式对于Windows Phone 8.1非常特别*,而不是在Windows 8.1中使用。由于Windows Phone项目中没有App.xaml,如何为Windows Phone指定ResourceDictionary?

*除了不同的大小和边距外,还广泛使用PhoneAccentBrush,这在Windows应用商店应用中显然不可用。

或者,如果Shared ResourceDictionary是首选方法,我该如何使用PhoneAccentBrush和其他仅限WP的资源?

4 个答案:

答案 0 :(得分:1)

  

因为Windows Phone项目中没有App.xaml

这不可能是真的。没有App.xaml,应用程序不会编译。您可能不会在共享项目中注意到它吗?

App.xaml

我没有看到移动/复制到每个项目App.xaml的问题

答案 1 :(得分:1)

我自己也经历过同样的事情。我在/Assets/Themes/MySharedStyles.xaml中的共享项目中拥有了所有样式。

通用应用中的共享内容模型非常酷。如果在两个项目中都有一个具有相同名称(可能是类型)的类或页面,那么它将在共享项目中可用。

这意味着您可以将所有共享样式放在MySharedStyles.xaml等文件中,然后在Windows和Windows Phone应用程序中创建资源字典,' /Assets / MyPlatformSpecificStyles.xaml'

在您的Shared App.xaml中,您可以执行以下操作:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Assets/Themes/MySharedStyles.xaml" />
    <ResourceDictionary Source="Assets/Themes/PlatformSpecificStyles.xaml" />
</ResourceDictionary.MergedDictionaries>

在设计时和运行时,将根据VS中的Platform DropDown从适当的项目中提取PlatformSpecificStyles。

如果您只想覆盖项目中的某些细节,例如在一个项目或另一个项目上交换FontFamily,则可以更改MySharedStyles文件中FontFamily="{TemplateBinding FontFamily}"的特定字体然后你可以简单地在你在项目中使用那种风格的地方设置它。

这些策略有效,我今天在应用中使用它们。

答案 2 :(得分:1)

Windows Phone强调颜色为available cross platform {ThemeResource SystemColorControlAccentColor},并引用该链接:

  

这也适用于Windows 8.1应用程序,因此可以在通用应用程序中共享XAML并仍然可以利用强调色。但是,由于Windows 8.1上不存在强调色,我们获得的颜色将始终为蓝莓。

您可能仍希望根据资源的颜色等构建画笔,但这些画笔可以放在共享的应用程序资源中,例如:

<Application
    x:Class="My.Universal.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:My.Universal">
    <Application.Resources>
        <!-- This will always be Blueberry on Windows 8, but will follow the accent colour on Windows Phone 8 -->
        <SolidColorBrush x:Key="AccentBrush" Color="{ThemeResource SystemColorControlAccentColor}"/>
    </Application.Resources>
</Application>

如果你确实希望为不同的平台拥有完全不同的资源,你可以将字典与两个项目中同一位置的字典合并 - 共享代码同时“神奇地”链接到两个项目

答案 3 :(得分:0)

曾经在Silverlight 8.0应用上工作的手机特定资源(例如PhoneAccentBrush)无法在通用应用中使用。

您可以使用相同的App.xaml文件来定义ResourceDictionary,应用程序生命周期等。

但是,由于您要定义特定于手机的资源,因此您需要为Windows Phone 8.1和Windows 8.1提供单独的资源字典,并使用相同的资源名称。