Bagikan melalui


Xamarin.Forms kamus sumber daya

ResourceDictionary adalah repositori untuk sumber daya yang digunakan oleh aplikasiXamarin.Forms. Sumber daya umum yang disimpan dalam ResourceDictionary termasuk gaya, templat kontrol, templat data, warna, dan pengonversi.

Di XAML, sumber daya yang disimpan dalam ResourceDictionary dapat dirujuk dan diterapkan ke elemen dengan menggunakan StaticResource ekstensi markup atau DynamicResource . Di C#, sumber daya juga dapat didefinisikan dalam lalu ResourceDictionary dirujuk dan diterapkan ke elemen dengan menggunakan pengindeks berbasis string. Namun, ada sedikit keuntungan untuk menggunakan ResourceDictionary dalam C#, karena objek bersama dapat disimpan sebagai bidang atau properti, dan diakses langsung tanpa harus terlebih dahulu mengambilnya dari kamus.

Membuat sumber daya di XAML

Setiap VisualElement objek turunan memiliki Resources properti, yang merupakan ResourceDictionary yang dapat berisi sumber daya. Demikian pula, Application objek turunan memiliki Resources properti, yang merupakan ResourceDictionary yang dapat berisi sumber daya.

Aplikasi Xamarin.Forms hanya berisi kelas yang berasal dari Application, tetapi sering menggunakan banyak kelas yang berasal dari VisualElement, termasuk halaman, tata letak, dan kontrol. Salah satu objek ini dapat mengatur propertinya Resources ke sumber daya yang ResourceDictionary berisi. Memilih tempat untuk menempatkan dampak tertentu ResourceDictionary di mana sumber daya dapat digunakan:

  • Sumber daya dalam ResourceDictionary yang dilampirkan ke tampilan seperti Button atau Label hanya dapat diterapkan ke objek tertentu.
  • Sumber daya dalam yang ResourceDictionary dilampirkan ke tata letak seperti StackLayout atau Grid dapat diterapkan ke tata letak dan semua turunan tata letak tersebut.
  • Sumber daya dalam yang ResourceDictionary ditentukan di tingkat halaman dapat diterapkan ke halaman dan ke semua turunannya.
  • Sumber daya dalam yang ResourceDictionary ditentukan di tingkat aplikasi dapat diterapkan di seluruh aplikasi.

Dengan pengecualian gaya implisit, setiap sumber daya dalam kamus sumber daya harus memiliki kunci string unik yang ditentukan dengan x:Key atribut .

XAML berikut menunjukkan sumber daya yang ditentukan dalam tingkat ResourceDictionary aplikasi dalam file App.xaml :

<Application xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ResourceDictionaryDemo.App">
    <Application.Resources>

        <Thickness x:Key="PageMargin">20</Thickness>

        <!-- Colors -->
        <Color x:Key="AppBackgroundColor">AliceBlue</Color>
        <Color x:Key="NavigationBarColor">#1976D2</Color>
        <Color x:Key="NavigationBarTextColor">White</Color>
        <Color x:Key="NormalTextColor">Black</Color>

        <!-- Implicit styles -->
        <Style TargetType="{x:Type NavigationPage}">
            <Setter Property="BarBackgroundColor"
                    Value="{StaticResource NavigationBarColor}" />
            <Setter Property="BarTextColor"
                    Value="{StaticResource NavigationBarTextColor}" />
        </Style>

        <Style TargetType="{x:Type ContentPage}"
               ApplyToDerivedTypes="True">
            <Setter Property="BackgroundColor"
                    Value="{StaticResource AppBackgroundColor}" />
        </Style>

    </Application.Resources>
</Application>

Dalam contoh ini, kamus sumber daya mendefinisikan sumber daya, beberapa Color sumber daya, dan dua sumber daya implisit.ThicknessStyle Untuk informasi selengkapnya tentang App kelas, lihat Xamarin.Forms Kelas Aplikasi.

Catatan

Ini juga valid untuk menempatkan semua sumber daya di antara tag eksplisit ResourceDictionary . Namun, karena Xamarin.Forms 3.0 ResourceDictionary tag tidak diperlukan. Sebagai gantinya ResourceDictionary , objek dibuat secara otomatis, dan Anda dapat menyisipkan sumber daya langsung di antara Resources tag elemen properti.

Mengonsumsi sumber daya di XAML

Setiap sumber daya memiliki kunci yang ditentukan menggunakan x:Key atribut , yang menjadi kunci kamusnya di ResourceDictionary. Kunci digunakan untuk mereferensikan ResourceDictionary sumber daya dari dengan StaticResource ekstensi atau DynamicResource markup.

Ekstensi StaticResource markup mirip DynamicResource dengan ekstensi markup karena keduanya menggunakan kunci kamus untuk mereferensikan nilai dari kamus sumber daya. Namun, saat StaticResource ekstensi markup melakukan pencarian kamus tunggal, DynamicResource ekstensi markup mempertahankan tautan ke kunci kamus. Oleh karena itu, jika entri kamus yang terkait dengan kunci diganti, perubahan diterapkan ke elemen visual. Ini memungkinkan perubahan sumber daya runtime untuk dilakukan dalam aplikasi. Untuk informasi selengkapnya tentang ekstensi markup, lihat Ekstensi Markup XAML.

Contoh XAML berikut menunjukkan cara menggunakan sumber daya, dan juga menentukan sumber daya tambahan dalam :StackLayout

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ResourceDictionaryDemo.HomePage"
             Title="Home Page">
    <StackLayout Margin="{StaticResource PageMargin}">
        <StackLayout.Resources>
            <!-- Implicit style -->
            <Style TargetType="Button">
                <Setter Property="FontSize" Value="Medium" />
                <Setter Property="BackgroundColor" Value="#1976D2" />
                <Setter Property="TextColor" Value="White" />
                <Setter Property="CornerRadius" Value="5" />
            </Style>
        </StackLayout.Resources>

        <Label Text="This app demonstrates consuming resources that have been defined in resource dictionaries." />
        <Button Text="Navigate"
                Clicked="OnNavigateButtonClicked" />
    </StackLayout>
</ContentPage>

Dalam contoh ini, ContentPage objek menggunakan gaya implisit yang ditentukan dalam kamus sumber daya tingkat aplikasi. Objek mengonsumsi StackLayout sumber daya yang PageMargin ditentukan dalam kamus sumber daya tingkat aplikasi, sementara Button objek menggunakan gaya implisit yang ditentukan dalam StackLayout kamus sumber daya. Ini menghasilkan tampilan yang ditunjukkan pada cuplikan layar berikut:

Mengonsumsi Sumber Daya ResourceDictionary

Penting

Sumber daya yang khusus untuk satu halaman tidak boleh disertakan dalam kamus sumber daya tingkat aplikasi, karena sumber daya tersebut kemudian akan diuraikan pada startup aplikasi alih-alih ketika diperlukan oleh halaman. Untuk informasi selengkapnya, lihat Mengurangi Ukuran Kamus Sumber Daya Aplikasi.

Perilaku pencarian sumber daya

Proses pencarian berikut terjadi ketika sumber daya dirujuk dengan StaticResource ekstensi atau DynamicResource markup:

  • Kunci yang diminta diperiksa di kamus sumber daya, jika ada, untuk elemen yang mengatur properti. Jika kunci yang diminta ditemukan, nilainya dikembalikan dan proses pencarian berakhir.
  • Jika kecocokan tidak ditemukan, proses pencarian mencari pohon visual ke atas, memeriksa kamus sumber daya dari setiap elemen induk. Jika kunci yang diminta ditemukan, nilainya dikembalikan dan proses pencarian berakhir. Jika tidak, proses berlanjut ke atas sampai elemen akar tercapai.
  • Jika kecocokan tidak ditemukan di elemen root, kamus sumber daya tingkat aplikasi akan diperiksa.
  • Jika kecocokan masih tidak ditemukan, akan XamlParseException dilemparkan.

Oleh karena itu, ketika pengurai XAML menemukan StaticResource ekstensi atau DynamicResource markup, ia mencari kunci yang cocok dengan melakukan perjalanan melalui pohon visual, menggunakan kecocokan pertama yang ditemukannya. Jika pencarian ini berakhir di halaman dan kunci masih belum ditemukan, pengurai XAML mencari ResourceDictionary yang dilampirkan ke App objek. Jika kunci masih belum ditemukan, pengecualian akan dilemparkan.

Mengambil alih sumber daya

Ketika sumber daya berbagi kunci, sumber daya yang didefinisikan lebih rendah di pohon visual akan lebih diutamakan daripada yang ditentukan lebih tinggi. Misalnya, mengatur AppBackgroundColor sumber daya ke AliceBlue di tingkat aplikasi akan ditimpa oleh sumber daya tingkat AppBackgroundColor halaman yang diatur ke Teal. Demikian pula, sumber daya tingkat AppBackgroundColor halaman akan ditimpa oleh sumber daya tingkat AppBackgroundColor kontrol.

Kamus sumber daya yang berdiri sendiri

Kelas yang berasal dari ResourceDictionary juga dapat berada dalam file XAML yang berdiri sendiri. File XAML kemudian dapat dibagikan di antara aplikasi.

Untuk membuat file tersebut, tambahkan Tampilan Konten atau item Halaman Konten baru ke proyek (tetapi bukan Tampilan Konten atau Halaman Konten hanya dengan file C#). Hapus file code-behind, dan dalam file XAML ubah nama kelas dasar dari ContentView atau ContentPage menjadi ResourceDictionary. Selain itu, hapus x:Class atribut dari tag akar file.

Contoh XAML berikut menunjukkan ResourceDictionary myResourceDictionary.xaml bernama:

<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
                    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
    <DataTemplate x:Key="PersonDataTemplate">
        <ViewCell>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.5*" />
                    <ColumnDefinition Width="0.2*" />
                    <ColumnDefinition Width="0.3*" />
                </Grid.ColumnDefinitions>
                <Label Text="{Binding Name}"
                       TextColor="{StaticResource NormalTextColor}"
                       FontAttributes="Bold" />
                <Label Grid.Column="1"
                       Text="{Binding Age}"
                       TextColor="{StaticResource NormalTextColor}" />
                <Label Grid.Column="2"
                       Text="{Binding Location}"
                       TextColor="{StaticResource NormalTextColor}"
                       HorizontalTextAlignment="End" />
            </Grid>
        </ViewCell>
    </DataTemplate>
</ResourceDictionary>

Dalam contoh ini, ResourceDictionary berisi satu sumber daya, yang merupakan objek jenis DataTemplate. MyResourceDictionary.xaml dapat dikonsumsi dengan menggabungkannya ke dalam kamus sumber daya lain.

Secara default, linker akan menghapus file XAML yang berdiri sendiri dari build rilis saat perilaku linker diatur untuk menautkan semua rakitan. Untuk memastikan bahwa file XAML yang berdiri sendiri tetap berada dalam build rilis:

  1. Tambahkan atribut kustom Preserve ke rakitan yang berisi file XAML yang berdiri sendiri. Untuk informasi selengkapnya, lihat Mempertahankan kode.

  2. Atur Preserve atribut di tingkat rakitan:

    [assembly:Preserve(AllMembers = true)]
    

Untuk informasi selengkapnya tentang penautan, lihat Menautkan aplikasi Xamarin.iOS dan Menautkan di Android.

Kamus sumber daya gabungan

Kamus sumber daya gabungan menggabungkan satu atau beberapa ResourceDictionary objek ke objek lain ResourceDictionary.

Menggabungkan kamus sumber daya lokal

File lokal ResourceDictionary dapat digabungkan ke objek lain ResourceDictionary dengan membuat ResourceDictionary objek yang propertinya Source diatur ke nama file file XAML dengan sumber daya:

<ContentPage ...>
    <ContentPage.Resources>
        <!-- Add more resources here -->
        <ResourceDictionary Source="MyResourceDictionary.xaml" />
        <!-- Add more resources here -->
    </ContentPage.Resources>
    ...
</ContentPage>

Sintaks ini tidak membuat instans MyResourceDictionary kelas. Sebagai gantinya, ini mereferensikan file XAML. Untuk alasan itu Source , saat mengatur properti, file code-behind tidak diperlukan, dan x:Class atribut dapat dihapus dari tag akar file MyResourceDictionary.xaml .

Penting

Properti Source hanya dapat diatur dari XAML.

Menggabungkan kamus sumber daya dari rakitan lain

Juga ResourceDictionary dapat digabungkan ke properti lain ResourceDictionary dengan menambahkannya ke MergedDictionaries properti ResourceDictionary. Teknik ini memungkinkan kamus sumber daya digabungkan, terlepas dari assembly tempat mereka berada. Menggabungkan kamus ResourceDictionary sumber daya dari rakitan eksternal mengharuskan tindakan build diatur ke EmbeddedResource, untuk memiliki file code-behind, dan untuk menentukan x:Class atribut dalam tag akar file.

Peringatan

Kelas ResourceDictionary juga mendefinisikan MergedWith properti. Namun, properti ini telah tidak digunakan lagi dan tidak boleh lagi digunakan.

Contoh kode berikut menunjukkan dua kamus sumber daya yang ditambahkan ke MergedDictionaries kumpulan tingkat ResourceDictionaryhalaman :

<ContentPage ...
             xmlns:local="clr-namespace:ResourceDictionaryDemo"
             xmlns:theme="clr-namespace:MyThemes;assembly=MyThemes">
    <ContentPage.Resources>
        <ResourceDictionary>
            <!-- Add more resources here -->
            <ResourceDictionary.MergedDictionaries>
                <!-- Add more resource dictionaries here -->
                <local:MyResourceDictionary />
                <theme:LightTheme />
                <!-- Add more resource dictionaries here -->
            </ResourceDictionary.MergedDictionaries>
            <!-- Add more resources here -->
        </ResourceDictionary>
    </ContentPage.Resources>
    ...
</ContentPage>

Dalam contoh ini, kamus sumber daya dari rakitan yang sama, dan kamus sumber daya dari rakitan eksternal, digabungkan ke dalam kamus sumber daya tingkat halaman. Selain itu, Anda juga dapat menambahkan objek lain ResourceDictionary dalam tag elemen properti, dan sumber daya lain di luar tag tersebut MergedDictionaries .

Penting

Hanya ada satu MergedDictionaries tag elemen properti dalam ResourceDictionary, tetapi Anda dapat menempatkan objek sebanyak ResourceDictionary yang diperlukan di sana.

Saat sumber daya yang digabungkan ResourceDictionary berbagi nilai atribut yang identik x:Key , Xamarin.Forms gunakan prioritas sumber daya berikut:

  1. Sumber daya lokal ke kamus sumber daya.
  2. Sumber daya yang terkandung dalam kamus sumber daya yang digabungkan melalui MergedDictionaries koleksi, dalam urutan terbalik yang tercantum dalam MergedDictionaries properti .

Catatan

Mencari kamus sumber daya dapat menjadi tugas intensif komputasi jika aplikasi berisi beberapa kamus sumber daya besar. Oleh karena itu, untuk menghindari pencarian yang tidak perlu, Anda harus memastikan bahwa setiap halaman dalam aplikasi hanya menggunakan kamus sumber daya yang sesuai dengan halaman.

Temukan video Xamarin lainnya di Channel 9 dan YouTube.