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下面,那是否工程下面所有的頁面都不需要作引用操作就可以獲取到相關資源呢?我還木有試過呢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章