WP8开发日志(4):ResourceDictionary的外联

也许,这是个简单的问题,可惜WP8的开发资料真的是少得可怜,还是折腾了半天,MSDN上面说得挺清楚,不过似乎是WPF的内容,可以参考这里:http://msdn.microsoft.com/zh-cn/library/cc903952(v=vs.95).aspx ,我在这里做一下简单的备忘。


一般我们在PhonePage里定义样式,是直接在PhoneApplicationPage.Resources的条目下写的,很明了的,本页面定义的资源只能在本页面里使用,根据CSS的思想,这里肯定会有办法让我们自己去定义一堆自己的控件或内容样式,应用里的每一个页面都可以去调用得到它。像下面的代码,是WP8工程每个默认页面都带有的调用系统样式的例子:

FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"


通过查看PhoneFontFamilyNormal定义,我们可以定位到一个叫DarkRed.xaml的文件,没错,这就是我们想要的效果,定义一个统一的样式文件,然后在应用的随便一个地方都可以调用得了,这个标准称呼就叫“资源字典的外联或合并”。


DarkRed.xaml本身就是一个很好的参考样本,在此为基础我们建立自己的样式资源文件,起码此文件上的引用信息是必须要用的,根据我上篇日志系列的例子工程,我打算将LongListSelector里的数据模板样式放到独立的资源文件里去,自建一个xaml的文件,Ctrl+C,Ctrl+V,像下面这个样子:

//MySource/MyDataTemplate.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:System="clr-namespace:System;assembly=mscorlib">
                                                                                                                                           
    <DataTemplate x:Key="TestDataItemTemplate">
        <StackPanel Margin="0,0,0,0">
            <TextBlock Text="{Binding Index}"/>
            <TextBlock Text="{Binding Name}" />
            <StackPanel Height="1" Background="AliceBlue"></StackPanel>
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="TestDataItemTemplate2">
        <StackPanel Margin="0,0,0,0">
            <TextBlock Foreground="Red" Text="{Binding Index}"/>
            <TextBlock Foreground="Yellow" Text="{Binding Name}" />
            <TextBlock Foreground="Green" Text="{Binding Flag}" />
            <StackPanel Height="1" Background="RoyalBlue"></StackPanel>
        </StackPanel>
    </DataTemplate>
</ResourceDictionary>


至于如何引用呢?资源字典是页面资源的一部分,所以还是要下PhoneApplicationPage.Resources下面作引用的操作,像下面这个样子:

//MainPage.xaml

<!--引用外部的资源字典文件-->
<phone:PhoneApplicationPage.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MySource/MyDataTemplate.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</phone:PhoneApplicationPage.Resources>


当然可以外联很多个资源文件,看你自己安排,其他的代码,一点也不须要动。最后,留个问题:如果将上面Resources里的内容放到App.xaml里的Application.Resources下面,那是否工程下面所有的页面都不需要作引用操作就可以获取到相关资源呢?我还木有试过呢。

你可能感兴趣的:(WP8,WPF,资源字典)