Pendahuluan
Setelah memposting artikel pertama tentang aplikasi
FAQ.Net saya
(program Windows note) , muncul pengguna pertama yang ingin mengembangkan program note mereka lebih lanjut.
Untuk meningkatkan minat pengguna, muncul ide untuk meningkatkan daya tariknya dengan menyesuaikan warna dan font.
Persyaratan untuk menyesuaikan tampilan aplikasi
- menyimpan dan memuat properti masing-masing komponen dalam file XML
- pengguna harus memiliki alat sederhana untuk menyesuaikan tampilan
- daftar komponen khusus harus diperluas dengan sangat sederhana (dalam satu baris kode)
- saat mengubah nilai properti, pengguna harus segera melihat perubahan pada formulir
- harus ada tombol batal yang memungkinkan Anda mengembalikan semua perubahan kembali
Hasil kerja
Jendela tampilan:

Pengaturan sebelum dan sesudah penampilan:

Untuk mengatasi masalah itu perlu
- menggunakan komponen PropertyGridEx untuk menampilkan dan mengubah properti komponen
- buat kelas CustomDesignControl untuk kenyamanan menyimpan properti dalam XML
- buat formulir MainForm, di mana kita akan mengubah tampilan
- buat formulir AppSettingsForm, di mana kami akan menyesuaikan tampilan MainForm
- buat kelas SettingsXml untuk kemudahan bekerja dengan XML
Fungsi untuk membatalkan perubahan
Untuk menerapkan penghapusan perubahan penampilan (klausa 5 persyaratan), saya memutuskan untuk menemukan cara universal untuk mengkloning properti komponen yang akan dibuat dalam memori dan mengganti komponen yang ditampilkan.
Objek kloning:
public static class ControlExtensions { public static T Clone<T>(T controlToClone) where T : Control { PropertyInfo[] controlProperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); T instance = Activator.CreateInstance<T>(); RichTextBox rtb = new RichTextBox(); foreach (PropertyInfo propInfo in controlProperties) { if (propInfo.Name == "Parent") continue; if (propInfo.CanWrite) { if (propInfo.Name != "WindowTarget") { propInfo.SetValue(instance, propInfo.GetValue(controlToClone, null), null); } } } return instance; }
Saya menyalin kode, menghapus properti yang tidak perlu yang tidak perlu disimpan, meninggalkan warna dan font.
Setelah memeriksa kode, kelemahan metode ini segera terungkap:
- casting kontrol apa pun ke kelas Kontrol yang digunakan, yang berarti bahwa setengah dari properti dapat hilang (misalnya, komponen DataGridView diwarisi dari kelas Kontrol, tetapi memiliki set properti sendiri tambahan)
- ketika mengkloning komponen, beberapa properti (misalnya: warna font di dalam sel DataGridView) tidak dikloning, tetapi membuat tautan ke komponen yang dikloning (mungkin ini karena properti digunakan dengan properti internal dan perlu ditangani dengan cara yang berbeda).
Dia mulai bereksperimen pada paragraf kedua, untuk mencapai kloning properti secara tepat.
Untuk melakukan ini, buat objek dengan tipe yang diinginkan dengan operator baru.
DataGridView dgvClone = new DataGridView();
Tidak berhasil, komponen tidak dapat mengembalikan perubahan kembali.
Kemudian saya mencoba membuat properti itu sendiri dengan operator baru dan mengaturnya dengan metode SetValue:
propInfo.SetValue(_controls[i], propInfo.GetValue(_controlsBeforeChange[i], null), null);
Dan metode ini tidak membuahkan hasil. Ketika nilai properti berubah dalam satu komponen, itu secara otomatis diperbarui dalam komponen yang dikloning.
Saya tidak mencari metode lain lagi dan membuat perubahan kembali hanya dengan me-restart aplikasi dengan kemampuan untuk menyimpan dokumen kerja atau membatalkan restart. Ini memungkinkan untuk secara signifikan menghemat memori aplikasi, karena tidak perlu membuat klon objek.
Contoh aplikasi dengan penyesuaian tampilan
Untuk berjaga-jaga, saya sudah menyiapkan
kode yang sudah jadi di mana setiap orang dapat memeriksa dan mungkin memodifikasi fungsi membatalkan perubahan dalam penampilan tanpa me-restart aplikasi dan memberi tahu kami tentang masalah di komentar.
Penting untuk memastikan bahwa ketika Anda mengklik tombol "AutoTest", komponen DataGridView memiliki latar belakang abu-abu dan font selnya kecil.

Unduh aplikasi Windows FAQ.Net (gratis):
(x64)
yadi.sk/d/sq3g4NOD3Zt7ZY(x86)
yadi.sk/d/NKXeyUWH3Zt8PQGrup VKKode Sumber FAQ.NetKesimpulan
Saya berharap bahwa di banyak aplikasi WinForms, berkat artikel ini, pengguna akhir akan memiliki kesempatan untuk menyesuaikan antarmuka dengan selera dan warna mereka.