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 sepertiButton
atauLabel
hanya dapat diterapkan ke objek tertentu. - Sumber daya dalam yang
ResourceDictionary
dilampirkan ke tata letak sepertiStackLayout
atauGrid
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.Thickness
Style
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:
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:
Tambahkan atribut kustom
Preserve
ke rakitan yang berisi file XAML yang berdiri sendiri. Untuk informasi selengkapnya, lihat Mempertahankan kode.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 ResourceDictionary
halaman :
<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:
- Sumber daya lokal ke kamus sumber daya.
- Sumber daya yang terkandung dalam kamus sumber daya yang digabungkan melalui
MergedDictionaries
koleksi, dalam urutan terbalik yang tercantum dalamMergedDictionaries
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.
Tautan terkait
- Ekstensi Markup XAML
- Xamarin.Forms Gaya
- Menautkan aplikasi Xamarin.iOS
- Menautkan di Android
- ResourceDictionary API