該項目在.NET Winforms應用程序中增加了對主題的支持。該項目支持開箱即用的和自定義主題,並使用我們的Winforms-stylable-Controls項目來樣式的控制風格支持。
首先,安裝報告機器工具:
dotnet tool install -g dotnet-reportgenerator-globaltool
接下來,構建項目的調試版本:
dotnet build WinFormsThemes/WinFormsThemes.sln -c Debug
然後可以使用:
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
我們使用stryker.net進行突變測試。要運行突變測試,請使用:
dotnet tool restore
dotnet stryker
重要的是:請勿在項目目錄中啟動Stryker - 您需要在解決方案DIR中啟動它,否則將找不到配置!
要使用此項目,您需要首先向我們的Nuget軟件包( dotnet add package AssortedDevelopment.WinFormsThemes )添加引用。
注意:目前,此項目需要.NET 6.0或更高。
接下來,您需要配置主題:
var registry = ThemeRegistryHolder . GetBuilder ( ) . Build ( ) ;
var theme = registry . ThemeRegistry . GetTheme ( ) ;例如,這可以將其放置在您的應用程序的Program.cs中,並使用默認設置查找主題,返回註冊表並使用其標準主題。
最後,您需要為所有表格提供主題的主題,並在Load事件中添加一行:
theme . Apply ( this ) ;這將應用於給定表格和所有孩子。
當然,您可以擴展此庫並自定義處理以滿足您的需求。這裡有幾個例子:
如果您想調試此庫的問題,則可以啟用登錄IThemeRegistryBuilder :
ThemeRegistryHolder . GetBuilder ( ) . SetLoggerFactory ( LoggerFactory ) . Build ( ) ;這將將庫的所有操作記錄到給定的ILoggerFactory 。
注意:調用SetLoggerFactory之前的任何呼叫都不會受到影響,因此我們建議儘早致電SetLoggerFactory 。
當您的項目中沒有依賴注入時,我們會提供公用事業,以使IThemeRegistry和ITheme在全球範圍內可用:
IThemeRegistry for IThemeRegistry ,我們提供了ThemeRegistryHolder類,該類可用於存儲註冊表並稍後檢索: ThemeRegistryHolder . ThemeRegistry = ThemeRegistryHolder . GetBuilder ( ) . Build ( ) ;之後,您可以使用var registry = ThemeRegistryHolder.ThemeRegistry;
ITheme對於ITheme , IThemeRegistry提供了Current屬性,可用於檢索當前主題。但是,為此,您需要配置定義當前主題的選擇器: private ITheme SelectCurrentTheme ( IThemeRegistry registry )
{
//logic to select theme here
}
.. .
ThemeRegistryHolder . ThemeRegistry = ThemeRegistryHolder . GetBuilder ( ) . WithCurrentThemeSelector ( SelectCurrentTheme ) . Build ( ) ;這使您可以使用IThemeRegistry.Current檢索當前主題和IThemeRegistry.OnThemeChanged ,以通知更改:
var mytheme = ThemeRegistryHolder . ThemeRegistry . Current ;
ThemeRegistryHolder . ThemeRegistry . OnThemeChanged += ( sender , args ) =>
{
//logic to handle theme change here
} ;默認情況下,我們的圖書館將在致電GetTheme時尊重操作系統的設置以及高度對比度。如果要添加其他選擇標準,或者想為用戶提供一個選擇以覆蓋此選擇的選項,則可以輕鬆執行此操作。您可以通過提供CurrentThemeSelector來設置IThemeRegistry.Current IThemeRegistry.GetTheme()中的默認設置。
IThemeRegistry registry = ThemeRegistryHolder . GetBuilder ( )
. WithCurrentThemeSelector ( registry => registry . GetTheme ( ) )
. Build ( ) ;
var selectedTheme = registry . CurrentTheme ;開箱即用,有兩種方法可以添加自定義主題:
themes .theme.jsonCONFIG_THEMING_THEME_開頭的任何彙編中的彙編資源兩種方式都使用相同的JSON格式來進行主題定義(版本定義了文件的格式)。一個簡單的例子可能是:
{
"name" : " theme-name " ,
"capabilities" : [ " DarkMode " , " HighContrast " ],
"version" : 3 ,
"variables" : {
"backColor" : " #082a56 " ,
"foreColor" : " #082a57 "
},
"colors" : {
"backColor" : " backColor " ,
"foreColor" : " foreColor " ,
"controls" : {
"backColor" : " backColor " ,
"foreColor" : " foreColor "
}
}
}有關可用設置的完整列表,請在此處查看我們的JSON模式。
如果這兩種方式不夠靈活,則可以自己實現主題並使用自定義主題源進行註冊(請參見下文):首選的方法是對AbstractTheme進行摘要,因為您只需要實現基本顏色並選擇覆蓋擴展顏色 - 造型控件由小型類造型。
更高級的方法是實現ITheme接口。這僅支持基本基礎架構,例如主題功能,但樣式完全掌握在您手中。
可以通過實現IThemeLookup (見下文)或將其直接添加到構建器來添加視圖:
ThemeRegistryHolder . GetBuilder ( )
. WithThemes ( )
. AddDefaultThemes ( )
. AddTheme ( new MySuperDarkTheme ( ) )
. FinishThemeList ( )
. Build ( ) ;如果要添加文件和資源以外的另一個主題源(例如,在實現自定義ITheme或AbstractTheme實現時),或者您只想更改文件夾路徑,則可以添加一個自定義IThemeLookup實現,該實現可處理可用主題的搜索:
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 ;
}
}
}之後,您需要在建設者中註冊此課程:
ThemeRegistryHolder . GetBuilder ( )
. WithThemes ( )
. AddDefaultThemes ( )
. WithLookup ( )
. FinishThemeList ( )
. Build ( ) ;由於我們不想強迫您使用特定的Winforms控制庫,因此我們目前僅支持Winforms-Sypy-Sylable-Controls項目中標準控件和控件的樣式。據我們了解,您可能還需要設計其他控件,我們支持添加專業插件來處理特定類型的控件的樣式。為此,您需要實現``::
internal class MyCustomControlThemePlugin : AbstractThemePlugin < MyCustomControl >
{
protected override void ApplyPlugin ( MyCustomControl mcc , AbstractTheme theme )
{
//style control based on the colors available in the Theme
}
}最後,您只需要註冊它的正確類型:
ThemeRegistryHolder . GetBuilder ( )
. AddThemePlugin ( new MyCustomControlThemePlugin ( ) )
. Build ( ) ;注意:當前,我們僅支持直接註冊的類型。子類不會自動設計!
請查看貢獻指南以獲取更多信息。