Apa yang istimewa dari Generic.xaml?

153

Saya telah mencoba mencari cara untuk mengatur file ResourceDictionary saya untuk digunakan kembali dan berbagi dengan anggota tim saya yang lain.

Saya terus menemukan "Generic.xaml", tetapi jika saya mencari MSDN untuk Generic.xaml atau hanya melakukan pencarian Google, saya hanya mendapatkan posting blog dan pertanyaan forum yang menyebutkannya - saya tidak bisa menemukan sesuatu yang benar-benar berwibawa dan jelas.

Apa perbedaan antara Generic.xaml dan MyRandomlyNamedResourceDictionary.xaml? Sepertinya demikian, saya harus merujuk ResourceDictionaries yang disimpan di perpustakaan dengan atribut Source. Misalnya,:

<Application.Resources>
    <ResourceDictionary
        Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>

Jadi, apa keuntungan yang diberikan Generic.xaml sebenarnya? Apakah ada tujuan jika saya tidak mencoba memberikan beberapa "tampilan" aplikasi saya (yaitu, jika saya hanya punya satu tema)?

penjahat
sumber
6
Anda tidak perlu menggabungkan kamus generic.xaml ke dalam kode Anda, jika Anda menggunakannya dengan kontrol khusus (sebagai lawan dari kontrol pengguna).
Eternal21

Jawaban:

152

Setiap Kontrol di WPF memiliki Gaya default yang menyediakan, antara lain, standar Kontrol ControlTemplate. WPF mencari gaya default di kamus sumber daya khusus di folder Tema di majelis yang sama dengan kontrol. Kunci untuk gaya default disediakan oleh Control.DefaultStyleKeyproperti dependensi, nilai default yang ditimpa di setiap sub-kelas Kontrol.

Nama kamus sumber daya tergantung pada tema Windows saat ini misalnya pada Vista menggunakan tema Aero, kamus disebut Aero.NormalColor.xaml, pada XP menggunakan tema default itu adalah Luna.NormalColor.xaml. Jika gaya tidak ditemukan dalam kamus tema, itu terlihat di Generic.xaml yaitu untuk kontrol yang penampilannya tidak tergantung pada tema.

Ini hanya berlaku untuk kontrol kustom apa pun yang telah Anda tetapkan yaitu kelas yang berasal dari Kontrol, langsung atau tidak langsung. Anda dapat mengubah gaya default untuk kontrol standar dengan mengambil darinya dan memanggil DefaultStyleKeyProperty.OverrideMetadatakonstruktor statis, tetapi Anda kemudian harus menyediakan gaya penuh termasuk ControlTemplate.

Perhatikan bahwa Anda dapat memberi tahu WPF untuk mencari di perakitan eksternal untuk gaya default Anda dengan menggunakan atribut ThemeInfo. Majelis eksternal harus dinamai <YourAssembly >. <ThemeName >.dll misalnya PresententationFramework.Aero.dll.

Phil Devaney
sumber
Terima kasih, Phil. Jadi, apakah Anda mengatakan bahwa jika saya hanya ingin memberikan ControlTemplate baru untuk kontrol Tombol normal (yaitu, tidak menulis kelas khusus saya sendiri yang berasal dari Button), ini tidak akan dianggap sebagai bagian dari "tema"?
devuxer
Ya, jika Anda hanya ingin template ulang atau gaya ulang kontrol standar, maka Anda menggunakan elemen Resources normal di UserControl / Window / Aplikasi / Apa pun levelnya. Anda dapat menggunakan gaya dengan kunci implisit ( msdn.microsoft.com/en-us/library/… ) untuk mengubah semua kontrol dari jenis tertentu.
Phil Devaney
@Zaheylu Ini berfungsi sekarang (saya pikir MS sedang memperbarui dokumen mereka)
Alan McBee - MSFT
104

Agar suatu generic.xamlfile (case-sensitive) menjadi sesuatu yang istimewa, dua syarat harus dipenuhi:

  • Itu harus di folder sub-root Tema dalam proyek
  • Majelis harus ditandai dengan ThemeInfoAttribute(biasanya di AssemblyInfo.cs)

Kemudian itu berfungsi sebagai lokasi pencarian standar untuk gaya default yang ingin Anda terapkan ke Kontrol Anda. Perhatikan juga bahwa untuk suatu style sebagai default, ia harus mendeklarasikan TargetType dan x: Key sebagai Type of Control yang akan ditata.

Jika Anda ingin menambahkan seluruh tema dan pengalihan tema ke aplikasi Anda, yang dilakukan dengan beberapa pengkodean, teknik ini hanya mendefinisikan kamus sumber daya default.

Kenan EK
sumber
3
Bisakah Anda menjelaskan apa yang Anda maksud dengan "gaya default"? Apakah ini berarti bahwa semua tombol akan secara otomatis mengambil gaya yang TargetType adalah "Tombol"? Atau apakah saya masih perlu referensi x:Keydengan menulis <Button Style="{StaticResource MyButtonStyle}" />? Apa yang terjadi jika ResourceDictionary berisi lebih dari satu Style yang TargetType-nya adalah "Tombol"? Terima kasih.
devuxer
3
Satu pertanyaan lain untuk membantu saya memahami hal ini: apakah Generic.xaml setara dengan WPF dari file CSS yang mendefinisikan tampilan default elemen yang berbeda, misalnya h1 {color:#00ff00},?
devuxer
3
Ya, gaya default akan berlaku tanpa secara eksplisit merujuk kunci, dan dua gaya identik akan memberikan kesalahan bahwa ada dua kunci identik dalam kamus. Dan ya, Anda bisa memikirkannya seperti itu, mengenai perilaku default.
Kenan EK
3
Hanya ingin menambahkan itu, meskipun benar bahwa ada batasan khusus pada file generic.xaml itu sendiri, entri kamus dalam generic.xaml dapat berupa kamus gabungan yang entri-entrinya dapat merujuk apa saja.
Tormod