Proyek ini menambah dukungan untuk tema dalam aplikasi WinForms .NET. Proyek ini mendukung tema out-of-the-box dan kustom dan menggunakan proyek-kontrol WinForms-stylable kami untuk bergaya kontrol yang tidak memiliki dukungan gaya.
Pertama, instal alat ReportGenerator:
dotnet tool install -g dotnet-reportgenerator-globaltool
Selanjutnya, bangun versi debug dari proyek:
dotnet build WinFormsThemes/WinFormsThemes.sln -c Debug
Laporan Cakupan Uji kemudian dapat dibuat menggunakan:
rmdir /s /q WinFormsThemesTestProjectTestResults
dotnet test WinFormsThemes/TestProject --no-build --verbosity normal --collect:"XPlat Code Coverage"
reportgenerator -reports:WinFormsThemesTestProjectTestResults*coverage.cobertura.xml -targetdir:WinFormsThemesTestProjectTestResultshtml -reporttypes:Html -sourcedirs:WinFormsThemesWinFormsThemes
start "" WinFormsThemesTestProjectTestResultshtmlindex.html
Kami menggunakan stryker.net untuk pengujian mutasi. Untuk menjalankan tes mutasi, gunakan:
dotnet tool restore
dotnet stryker
PENTING: Jangan mulai Stryker di direktori proyek - Anda harus memulainya di Solution Dir, jika tidak konfigurasi tidak akan ditemukan!
Untuk menggunakan proyek ini, Anda perlu menambahkan referensi ke paket nuget kami ( dotnet add package AssortedDevelopment.WinFormsThemes ) terlebih dahulu.
Catatan: Saat ini, proyek ini membutuhkan .NET 6.0 atau lebih tinggi.
Selanjutnya, Anda perlu mengonfigurasi tema:
var registry = ThemeRegistryHolder . GetBuilder ( ) . Build ( ) ;
var theme = registry . ThemeRegistry . GetTheme ( ) ; Ini dapat, misalnya, ditempatkan di Program.cs aplikasi Anda dan menggunakan pengaturan default untuk mencari tema, mengembalikan registri dan menggunakan tema standarnya.
Akhirnya, Anda perlu memberikan tema untuk semua formulir untuk bertema dan menambahkan satu baris di acara Load :
theme . Apply ( this ) ;Ini akan menerapkan tema ini pada formulir yang diberikan dan semua anak.
Tentu saja, Anda dapat memperluas perpustakaan ini dan menyesuaikan penanganan yang sesuai dengan kebutuhan Anda. Berikut beberapa contoh:
Jika Anda ingin men -debug masalah dengan perpustakaan ini, Anda dapat mengaktifkan penebangan di IThemeRegistryBuilder :
ThemeRegistryHolder . GetBuilder ( ) . SetLoggerFactory ( LoggerFactory ) . Build ( ) ; Ini akan mencatat semua tindakan perpustakaan ke ILoggerFactory yang diberikan.
CATATAN: Panggilan apa pun sebelum menelepon SetLoggerFactory tidak akan terpengaruh sehingga kami menyarankan untuk menghubungi SetLoggerFactory sedini mungkin.
Ketika Anda tidak memiliki injeksi ketergantungan yang tersedia dalam proyek Anda, kami menyediakan utilitas untuk membuat IThemeRegistry dan ITheme tersedia secara global:
IThemeRegistry untuk IThemeRegistry , kami menyediakan kelas ThemeRegistryHolder yang dapat digunakan untuk menyimpan registri dan mengambilnya nanti: ThemeRegistryHolder . ThemeRegistry = ThemeRegistryHolder . GetBuilder ( ) . Build ( ) ; Setelah ini, Anda dapat mengambil registri dari mana saja di aplikasi Anda menggunakan: var registry = ThemeRegistryHolder.ThemeRegistry;
ITheme untuk ITheme , IThemeRegistry menyediakan properti Current yang dapat digunakan untuk mengambil tema saat ini. Agar ini berfungsi, Anda perlu mengkonfigurasi pemilih yang mendefinisikan tema saat ini: private ITheme SelectCurrentTheme ( IThemeRegistry registry )
{
//logic to select theme here
}
.. .
ThemeRegistryHolder . ThemeRegistry = ThemeRegistryHolder . GetBuilder ( ) . WithCurrentThemeSelector ( SelectCurrentTheme ) . Build ( ) ; Ini memungkinkan Anda untuk menggunakan IThemeRegistry.Current Murah untuk mengambil tema saat ini dan IThemeRegistry.OnThemeChanged
var mytheme = ThemeRegistryHolder . ThemeRegistry . Current ;
ThemeRegistryHolder . ThemeRegistry . OnThemeChanged += ( sender , args ) =>
{
//logic to handle theme change here
} ; Secara default, perpustakaan kami akan menghormati pengaturan sistem operasi sehubungan dengan mode gelap dan kontras tinggi saat memanggil GetTheme . Jika Anda ingin menambahkan kriteria pilihan tambahan atau Anda ingin memberi pengguna opsi untuk mengesampingkan pilihan ini, Anda dapat melakukannya dengan mudah. Alih -alih mengandalkan pengaturan default di IThemeRegistry.GetTheme() Anda dapat mengatur IThemeRegistry.Current Murah dengan tema apa pun yang Anda inginkan dengan memberikan CurrentThemeSelector :
IThemeRegistry registry = ThemeRegistryHolder . GetBuilder ( )
. WithCurrentThemeSelector ( registry => registry . GetTheme ( ) )
. Build ( ) ;
var selectedTheme = registry . CurrentTheme ;Di luar kotak, ada 2 cara Anda dapat menambahkan tema khusus:
.theme.json disimpan di direktori themes DR yang berfungsi.CONFIG_THEMING_THEME_Kedua cara menggunakan format JSON yang sama untuk definisi tema (versi mendefinisikan format file). Contoh sederhana dari ini bisa adalah:
{
"name" : " theme-name " ,
"capabilities" : [ " DarkMode " , " HighContrast " ],
"version" : 3 ,
"variables" : {
"backColor" : " #082a56 " ,
"foreColor" : " #082a57 "
},
"colors" : {
"backColor" : " backColor " ,
"foreColor" : " foreColor " ,
"controls" : {
"backColor" : " backColor " ,
"foreColor" : " foreColor "
}
}
}Untuk daftar lengkap pengaturan yang tersedia, silakan periksa skema JSON kami di sini.
Jika 2 cara itu tidak cukup fleksibel, Anda dapat mengimplementasikan tema sendiri dan mendaftarkannya menggunakan sumber tema khusus (lihat di bawah): Cara yang disukai adalah dengan subkelas AbstractTheme .
Cara yang lebih maju mengimplementasikan antarmuka ITheme . Ini hanya mendukung infrastruktur dasar seperti kemampuan tema tetapi gaya benar -benar ada di tangan Anda.
Tampilan dapat ditambahkan dengan mengimplementasikan IThemeLookup (lihat di bawah) atau dengan menambahkannya langsung ke pembangun:
ThemeRegistryHolder . GetBuilder ( )
. WithThemes ( )
. AddDefaultThemes ( )
. AddTheme ( new MySuperDarkTheme ( ) )
. FinishThemeList ( )
. Build ( ) ; Jika Anda ingin menambahkan sumber tema lain selain file dan sumber daya (misalnya saat mengimplementasikan Implementasi Kustom ITheme atau AbstractTheme ) atau Anda hanya ingin mengubah jalur folder, Anda dapat menambahkan implementasi IThemeLookup khusus yang menangani pencarian tema yang tersedia:
internal class MyThemeLookup : IThemeLookup
{
public int Order => 999 ; //highest order wins when 2 lookups return the same theme name
public List < ITheme > Lookup ( )
{
List < ITheme > results = new List < ITheme > ( ) ;
//implement search for themes here
return results ;
}
}
}Setelah ini, Anda perlu mendaftarkan kelas ini di pembangun:
ThemeRegistryHolder . GetBuilder ( )
. WithThemes ( )
. AddDefaultThemes ( )
. WithLookup ( )
. FinishThemeList ( )
. Build ( ) ;Karena kami tidak ingin memaksa Anda untuk menggunakan Perpustakaan Kontrol WinForms tertentu, saat ini kami hanya mendukung gaya kontrol standar dan kontrol dari proyek pengendalian WinForms-stylable kami. Seperti yang kami pahami, Anda mungkin juga ingin menata kontrol lain, kami mendukung menambahkan plugin khusus untuk menangani gaya kontrol jenis tertentu. Untuk melakukan ini, Anda perlu menerapkan ``:
internal class MyCustomControlThemePlugin : AbstractThemePlugin < MyCustomControl >
{
protected override void ApplyPlugin ( MyCustomControl mcc , AbstractTheme theme )
{
//style control based on the colors available in the Theme
}
}Akhirnya, Anda hanya perlu mendaftarkannya untuk jenis yang benar:
ThemeRegistryHolder . GetBuilder ( )
. AddThemePlugin ( new MyCustomControlThemePlugin ( ) )
. Build ( ) ;Catatan: Saat ini, kami hanya mendukung jenis yang terdaftar secara langsung. Subkelas tidak akan ditata secara otomatis!
Silakan lihat panduan yang berkontribusi untuk informasi lebih lanjut.