Saat menggunakan sumber daya seperti kuas, templat, dan gaya di WPF, mereka dapat ditentukan sebagai StaticResources
<Rectangle Fill="{StaticResource MyBrush}" />
atau sebagai DynamicResource
<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}" />
Sebagian besar waktu (selalu?), Hanya satu yang berfungsi dan yang lainnya akan melempar pengecualian selama runtime. Tapi saya ingin tahu mengapa:
- Apa perbedaan utamanya? Suka ingatan atau implikasi kinerja
- Apakah ada aturan di WPF seperti "kuas selalu statis" dan "templat selalu dinamis" dll.?
Saya menganggap pilihan antara Statis vs Dinamis tidak semena-mena seperti kelihatannya ... tapi saya gagal melihat polanya.
Jawaban:
Sebuah StaticResource akan diselesaikan dan ditugaskan untuk properti selama pemuatan XAML yang terjadi sebelum aplikasi benar-benar menjalankan. Ini hanya akan diberikan satu kali dan perubahan pada kamus sumber daya diabaikan.
Sebuah DynamicResource memberikan sebuah objek Expression ke properti selama pemuatan tetapi tidak benar-benar lookup sumber daya sampai runtime ketika objek Ekspresi diminta untuk nilai. Ini menghalangi mencari sumber daya sampai dibutuhkan saat runtime. Contoh yang baik akan menjadi referensi maju ke sumber daya yang ditentukan kemudian di XAML. Contoh lain adalah sumber daya yang bahkan tidak akan ada sampai runtime. Ini akan memperbarui target jika kamus sumber daya diubah.
sumber
It will update the target if the source resource dictionary is changed.
Saya juga bingung tentang mereka. Lihat contoh ini di bawah:
Di sini saya telah menggunakan sumber daya dinamis untuk tombol dan jendela dan belum menyatakannya di mana saja. Setelah runtime, ResourceDictionary dari hierarki akan diperiksa. Karena saya belum mendefinisikannya, saya kira default akan digunakan.
Jika saya menambahkan kode di bawah ini untuk mengklik acara Button, karena mereka menggunakan DynamicResource, latar belakang akan diperbarui.
Jika mereka menggunakan StaticResource:
Saya harap saya membersihkan beberapa kebingungan.
sumber
StaticResource akan diselesaikan pada konstruksi objek.
DynamicResource akan dievaluasi dan diselesaikan setiap kali kontrol membutuhkan sumber daya.
sumber
Misalkan Anda memiliki kamus Style bersarang ini. LightGreen berada di tingkat root sedangkan Pink bersarang di dalam Grid.
Dalam penglihatan:
StaticResource akan merender tombol sebagai LightGreen, nilai pertama yang ditemukan dalam style. DynamicResource akan mengesampingkan tombol LightGreen sebagai Pink saat merender Grid.
StaticResource
DynamicResource
Perlu diingat bahwa VS Designer memperlakukan DynamicResource sebagai StaticResource. Itu akan mendapatkan nilai pertama. Dalam hal ini, VS Designer akan membuat tombol sebagai LightGreen meskipun sebenarnya berakhir sebagai Pink.
StaticResource akan melempar kesalahan ketika gaya tingkat akar (LightGreen) dihapus.
sumber
Apa perbedaan utamanya? Suka ingatan atau implikasi kinerja
Perbedaan antara sumber daya statis dan dinamis terjadi ketika objek yang mendasarinya berubah. Jika Kuas Anda yang ditentukan dalam koleksi Sumber Daya diakses dalam kode dan disetel ke instance objek yang berbeda, Rectangle tidak akan mendeteksi perubahan ini.
Sumber Daya Statis diambil sekali dengan merujuk elemen dan digunakan untuk seumur hidup sumber daya. Padahal, DynamicResources mengambil setiap kali digunakan.
Kelemahan dari sumber daya Dinamis adalah bahwa mereka cenderung menurunkan kinerja aplikasi.
Apakah ada aturan di WPF seperti "kuas selalu statis" dan "templat selalu dinamis" dll.?
Praktik terbaik adalah menggunakan Sumber Daya Statis kecuali ada alasan khusus seperti Anda ingin mengubah sumber daya dalam kode di belakang secara dinamis. Contoh lain contoh di mana Anda ingin t menggunakan resoruces dinamis termasuk ketika Anda menggunakan SystemBrushes, SystenFonts dan Parameter Sistem.
sumber
Semua jawaban bermanfaat, hanya ingin menambahkan satu lagi use case.
Dalam skenario WPF komposit, kontrol pengguna Anda dapat menggunakan sumber daya yang ditentukan dalam jendela induk lain / kontrol (yang akan meng-host kontrol pengguna ini) dengan merujuk sumber daya tersebut sebagai DynamicResource.
Seperti yang disebutkan oleh orang lain, Staticresource akan dilihat pada waktu kompilasi. Kontrol pengguna tidak dapat merujuk ke sumber daya yang ditentukan dalam kontrol hosting / induk. Padahal, DynamicResource dapat digunakan dalam kasus ini.
sumber
Manfaat penting dari sumber daya dinamis
jika startup aplikasi membutuhkan waktu yang sangat lama, Anda harus menggunakan sumber daya dinamis, karena sumber daya statis selalu dimuat saat jendela atau aplikasi dibuat, sedangkan sumber daya dinamis dimuat saat pertama kali digunakan.
Namun, Anda tidak akan melihat manfaat apa pun kecuali sumber daya Anda sangat besar dan kompleks.
sumber
Sumber daya dinamis hanya dapat digunakan ketika properti sedang disetel pada objek yang berasal dari objek dependensi atau dapat dibekukan di mana sumber daya statis dapat digunakan di mana saja. Anda dapat memisahkan seluruh kontrol menggunakan sumber daya statis.
Sumber daya statis digunakan dalam kondisi berikut:
Sumber daya dinamis:
sumber